关于 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,对它可以直接使用正常的正则表达式进行搜索,如

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')

这回直接输出明文了


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM