關於 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