关于 response 中的正则式匹配及 \x 解析问题(原创)

关于 response 中的正则式匹配及 \x 解析问题(原创)

在使用 requests 对一个网页返回的信息进行解析时遇到这样一个问题,网页中使用 JS 返回一个 Token,型如:

<script type='text/javascript'>
eval('\x69\x66\x28\x4c\x35\x2e\x41\x6a\x61\x78\x29\x7b\x4c\x35\x2e\x41\x6a\x61\x78\x2e\x64\x65\x66\x61\x75\x6c\x74\');</script>

第一个问题是如何使用正则表达式从 requests 的返回值中取得上文中单引号之间的代码,最初使用 re.search 时触发了 “cannot use a string pattern on a bytes-like object” 类型的异常,之所以遇到这个问题,是因为 response.text 的类型是 str,对它可以直接使用正常的正则表达式进行搜索,如

import re
ret = re.search("eval\('(.*)'\);</script>", response.text)

但是要搜索的 JS 代码不是 response.text 的内容,必须在 response.content 中查找,而 response.content 的类型是 bytes,对其直接使用下面的代码进行正则搜索时,就会触发异常。

ret = re.search("eval\('(.*)'\);</script>", response.content)

解决方法有两个:

1、使用 b 编码的正则表达式,使 re.search 的两个参数类型一致:

ret = re.search(b"eval\('(.*)'\);</script>", response.content)

2、对 response.content 使用 decode('utf-8') 也可以解决此问题

ret = re.search("eval\('(.*)'\);</script>", response.content.decode('utf-8'))

第二个问题是:当使用正则表达式匹配到 Token 串后,打印出来是 \x69\x66\x28\x4c\x35\x2e\x41\x6a\x61\x78\x29\x7b\x4c\x35\x2e\x41\x6a\x61\x78\x2e\x64\x65\x66\x61\x75\x6c\x74 的形式,而在代码中使用

s = '\x69\x66\x28\x4c' #前4字节
print(s) # 输出 if(L

肯定是关于编解码的问题,后来发现下面的方法可以解决:

import re
ret = re.search(b"eval\('(.*)'\);</script>", response.content)
if ret:
    TokenBody = ret.group(1).decode('unicode-escape')

这回直接输出明文了

posted @ 2023-04-14 10:17  汉学  阅读(0)  评论(0)    收藏  举报