json與re的再次複習

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

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

 

一.json

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

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

在python中,由於把json數據轉化爲pyth內建數據類型很簡單,所以如果找到能返回json數據的url,就儘量使用選擇這種url。

我們牢牢記住這一點,

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

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

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

 

二.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轉換回字符串類型,但是內容不變。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章