关于 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,对它可以直接使用正常的正则表达式进行搜索,如
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
肯定是关于编解码的问题,后来发现下面的方法可以解决:
ret = re.search(b"eval\('(.*)'\);</script>", response.content) if ret: TokenBody = ret.group(1).decode('unicode-escape')
这回直接输出明文了