關於 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')
這回直接輸出明文了