Python-網頁轉義字元及正則全文匹配
前言
大部分情況下,通過request去請求網頁,response.text返回來的都是正常值,但是有一些反爬蟲比較嚴重的網站(比如知乎)就不會是這樣。知乎會返回轉義字元,例如:
header = {
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0",
"HOST":"www.zhihu.com",
"Referer":"https://www.zhihu.com/signup?next=%2F",
}
def rget():
response = session.get("https://www.zhihu.com/signup?next=%2F", headers=header)
target_str = response.text
print(target_str)
rget()
在給知乎的登入頁面發請求後,列印返回結果(內容太多,只返回一小部分):
"token":{"xsrf":"9b6c6406-db1b-45fa-8626-296c037cfc00","xUDID":"ANBsasFlAg2PTgaqB1CHBtsWMijmJ20s89E="},"account":{"lockLevel":{}
發現有很多字元是轉義的,登入需要用到的xsrf欄位也在這裡面,這樣做正則匹配就很麻煩。
解決的辦法是將html進行轉義:
import html
target_str = html.unescape(response.text)
就能夠得到正常的返回資訊了:
"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},
正則匹配
匹配xsrf的值 (為了方便測試,只將一小部分值提取出來做匹配):
tokens = `"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:`
matchs = re.search(r`xsrf[:"w-]+`, tokens)
if matchs:
print(matchs.group(0))
else:
print("未匹配")
得到輸出結果為:
xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920"
然後再借用replace將引號替換,然後用split將值用冒號分開:
import re
tokens = `"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:`
matchs = re.search(r`xsrf[:"w-]+`, tokens)
nstr = matchs.group(0).replace(""", "").split(":")
finall = nstr[1]
print(finall)
就得到了我需要的xsrf:
9febf0fd-7c47-4695-93b6-f670e518d920
xUDID的提取也是如此,這兩個值在知乎登入的時候是需要攜帶的,所以要提取:
import re
tokens = `"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:`
matchs = re.search(r`xUDID[:"w-]+=`, tokens)
nstr = matchs.group(0).replace(""", "").split(":")
finall = nstr[1]
print(finall)
ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc=
re正則匹配html的坑
上面的正則可以匹配到字串了,如果正常登入的話要將請求返回的內容文字進行匹配的,也就是匹配response.text,程式碼是否就是
matchs = re.search(r`xUDID[:"w-]+=`, response.text)
坑就在這裡!
re預設匹配的是單行字串,而response.text的返回值雖然是一個html頁面的構成,但是它是分行的,第一行是html頭<! DOCUMENT html>不是我想要的整個文字進行匹配。
re是支援整個文字匹配的,需要在正則程式碼加上引數re.DOTALL即可:
matchs = re.search(r`xUDID[:"w-]+=`, response.text, re.DOTALL)
就可以對整個返回的文字進行匹配了
相關文章
- 正則匹配指定字元之前的字串字元字串
- php正則匹配所有違規字元PHP字元
- 正則匹配方法及示例
- 關於轉義符 在php正則中的匹配問題PHP
- 正規表示式 轉義字元字元
- 匹配純小寫英文字元正則程式碼字元
- 正則匹配規則2
- 正則-元字元字元
- 轉義正規表示式中特殊字元字元
- 正規表示式需要轉義的字元字元
- 正則匹配規則記錄
- 正則匹配數字
- Python正則匹配中文Python
- grep 多行 正則匹配
- PHP 正則匹配中文PHP
- Logstash之Grok正則匹配,讓正則進階!
- python的re正則匹配Python
- Laravel redis 正則匹配keysLaravelRedis
- pyhanlp 繁簡轉換之拼音轉換與字元正則化HanLP字元
- Java處理正則匹配卡死(正則回溯問題)Java
- 匹配空白字元正規表示式字元
- 轉義字元字元
- 網頁提取資料常用正則網頁
- 全文檢索的轉義
- java中url正則regex匹配Java
- 正則匹配的捕獲組
- apisix~路由字首的正則匹配API路由
- 正規表示式匹配雙位元組字元字元
- shell正則匹配捕獲引用進行IP匹配
- oracle轉義字元Oracle字元
- 正則匹配之零寬斷言
- 正則匹配開頭和結尾
- 匹配純英文字元正規表示式字元
- 正則替換 修改字元 去除空格字元
- 折行轉義字元字元
- Oracle 特殊字元轉義Oracle字元
- Markdown常用轉義字元字元
- 網址URL中特殊字元轉義編碼字元