json與re的再次複習

在瀏覽本文以前,建議先溫習一下如下博客的連接:html

https://www.cnblogs.com/Masterpaopao/p/10061575.htmlpython

 

一.json正則表達式

json,在爬蟲中毫無疑問扮演着極爲重要的角色:json

JSON是一種輕量級的數據交換格式,適用於進行數據交互的場景。函數

在python中,因爲把json數據轉化爲pyth內建數據類型很簡單,因此若是找到能返回json數據的url,就儘可能使用選擇這種url。編碼

咱們緊緊記住這一點,url

json.loads() --> 把json數據轉換爲python數據,轉換以後的數據類型是字典。spa

json.dumps()-->把python數據轉換爲json數據,轉換以後的數據類型是字符串,可是你在輸出中可能會看不見有引號的存在,格外注意這一點。code

那麼有時候處理數據的時候,咱們想要保留json的原形態,顯示其編碼,在括號內傳遞一個ensure_ascii=False的參數orm

 

二.re

①re.findall

re.findall功能:在字符串中找到正則表達式所匹配的全部子串,並返回一個列表,若是沒有找到匹配的,則返回空列表。

總結:re.findall的輸出是列表。

 

經常使用正則表達式的方法:

 

re.compile(編譯)
re.match(從頭找一個)
re.search(找一個)
re.findall(找全部)
re.sub(替換)

 

 

一些常見的匹配符號:

   .   :匹配全部字符除換行符「\n

"\d":匹配任意的數字

"\w":匹配數字和字母以及下劃線

"\s":匹配空白符號,包括相關製表符

 

匹配貪婪與非貪婪:

 

* :匹配前一個字符0或無限次
+ :匹配前一個字符1次或者無限次
? :匹配前一個字符0次或1次
{m} :匹配前一個字符m次
經常使用的匹配方式:
.*? :以*和?貪婪的方式匹配全部

 

②(.*?): 匹配出來括號內的內容

③([\s\S]*?):匹配出來括號內的內容

針對①和②的內容寫出一個代碼論證:

 

import re
a="abc123qwe456!@#$555"
b=re.findall("abc.*?555",a)
print(b)
c=re.findall("abc(.*?)555",a)
print(c)
輸出結果:
['abc123qwe456!@#$555']
['123qwe456!@#$']

 

咱們能夠對比b和c的輸出結果,首先,這二者的輸出結果都是列表,這是毫無疑問的,這個須要牢牢記住。

而後就是括號和無括號的區別,無括號的時候匹配出來全部,

有括號的時候,括號兩旁的字符成了定位字符,只匹配出來括號內的內容。

 

②re.sub

 

re.sub用於替換字符串中的匹配項,是對字符串的指定部分進行正則替換操做的函數。公式以下:

re.sub(pattern, repl, string, count=0, flags=0)

pattern是字符串中要更換的部分,repl是更換的內容,string是原始字符串。

count是須要更換的次數,按順序更換。其中,count=0是默認替換所有,而不是替換0個。

flags是可選的,表示匹配模式,好比忽略大小寫,多行模式等

 

只須要注意一下輸出的結果是字符串,具體的請參考我開頭貼的博客,具體我就再也不復述了。

 

 

正則使用的注意點:

1.re.findall("a(.*?)b","str")可以返回括號中的內容,括號先後的內容起到定位和過濾的效果。

2.原始字符串,待匹配字符串中有反斜槓的時候,使用r可以忽視反斜槓帶來的轉義的效果。

3.點號默認匹配不到「'\n」,"\s"可以匹配空白字符,不單單包含空格,還有「\t」。

 

那麼,我將結合json和re來實戰一個簡單的爬蟲,幫助你們更好的理解:

 

import requests
import json
import re

url="https://36kr.com/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"}
html_1=requests.get(url,headers=headers)
html_2=html_1.content.decode()
print(html_2)

ret=re.findall("<script>var props=(.*?),locationnal=",html_2)[0]
html=json.loads(ret)
with open("36k.html","w",encoding="utf-8") as f:
f.write(json.dumps(html,ensure_ascii=False))
 
這段代碼完美地融合了本片講到的知識點,但願你們能夠好好理解這段代碼。
我先回答一個疑問,有人會認爲json.loads()和json.dumps()能夠直接去掉,實際上是不同的。
你去掉以後,你會發現獲得的文件沒有通過格式轉化:
咱們先json.loads()轉換爲python文本格式,確保咱們可讀代碼,
而後再json.dumps轉換回字符串類型,可是內容不變。
相關文章
相關標籤/搜索