Ptyhon網絡爬蟲(第五篇)——網頁解析
正則表達式BeautifulSoupLxml
正則表達式——對字符串操作的邏輯公式1:介紹
用事先定義好的特定字符和這些特定的字符的組合組成一個規則字符串,用來表達對字符串的一種過濾邏輯。好比人工智慧中的謂詞邏輯:小明喜歡貓,小明也喜歡金魚,用小明去匹配到貓和金魚的有個過程。
提取網頁中的數據時,先把原始碼變成字符串,然後用正則表達式匹配想要的數據。
常見的正則字符和含義如下表
2:Python正則表達式的三種方法
re.match:從字符串起始位置匹配一個模式,如果從起始位置匹配不了,match()就返回none。
語法:re.match(pattern,string,flag=0)
pattern是正則表達式包含一些特殊的字符
string為要匹配的字符串
flags用來控制正則表達式的匹配方式:是否區分大小寫、多行匹配等
匹配具有一定模式的字符串:
其中r『(.*)is(.*!)』的r代表rawstring 純粹的字符串,使用它就不會對引號裡面的反斜槓「\」進行特殊處理。
兩個反斜槓「字符串轉義」會把「\\」轉義為「\」。
使用r『……』,原始字符串的方法,不會對引號裡面的反斜槓『\』進行特殊處理。
正則表達式的轉義:
需要匹配的r『5\9』中的字符「\」,使用程式語言表示的正則表達式裡需要4個反斜槓「\\\\」:前兩個反斜槓「\\」和後兩個反斜槓「\\」各自在字符串轉義成一個反斜槓「\」,4個反斜槓「\\\\」就轉義成了兩個反斜槓「\\」,這兩個反斜槓「\\」最終在正則表達式轉義成一個反斜槓「\」
使用了r『...』方法後,不需要進行字符轉義,直接進入第二步「正則轉義」,在正則轉義中「」
正則表達式要經過「字符串轉義」和「正則轉義」
如果不用r『…』方法的話,就需要進行「字符串轉義」和「正則轉義」
re.search:掃描整個字符串並返回第一個成功的匹配
re.match只能從字符串的起始位置進行匹配,「.com」在後面,所以匹配不到。
其他方面re.search與re.match一樣,可以參照上面的re.match來操作。
re.findall:可以找到所有的匹配結果,如下:
Pattern:』[0-9]+』:任意長度的數字
例如:爬取百度熱榜
import requestsimport relink='https://www.baidu.com/'headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/87.0.4280.88 Safari' '/537.36 Edg/87.0.664.66','Host':'www.baidu.com'}r=requests.get(url=link,headers=headers)print(r.status_code)html=r.texttitle_list=re.findall('<span>(.*?)</span>',html)print(title_list)
上述代碼用於提取百度熱榜詞條,使用findall匹配,使用'<span>(.*?)</span>'正則表達式表示對所有滿足此條件的結果。表示只提取(.*?)部分。
使用BeautifulSoup解析網頁BeautifulSoup可以從HTML或XML文件中提取數據。可以提供一些簡單的、Python式的函數用來處理導航搜索、修改分析樹等。
例如:爬取百度熱榜
import requestsfrom bs4 import BeautifulSouplink='https://www.baidu.com/'headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/87.0.4280.88 ' 'Safari/537.36 Edg/87.0.664.66'}r=requests.get(url=link,headers=headers)soup=BeautifulSoup(r.text,'lxml')title_list=soup.find_all('span',class_='title-content-title')i=1for i in range(len(title_list)): title=title_list[i].text print(i+1,':',title)
BeautifulSoup對象是一個複雜的樹形結構,他的每一個節點都是一個Python對象,獲取網頁的內容就是一個提取對象內容的過程。
提取對象的方法:
1:遍歷文檔樹:好比爬樹:樹幹——小樹幹——樹枝
2:搜索文檔樹:在搜索文檔樹時,最常用的是find()、find_all()。第一章已提到
3:CSS選擇器:可作為遍歷文檔樹的方法提取數據,也可作為搜索文檔樹的方法提取數據。
使用lxml解析網頁Lxml使用C語言編寫,解析速度比不使用lxml的BeautifulSoup快一些。和BeautifulSoup相比,lxml還多了一種Xpath選擇器的方法。Xpath是一門在XML文檔中查找信息的語言,通過使用路徑表達式來選取XML文檔中的節點或節點集,也可以用在HTML獲取數據中。
import requestsfrom lxml import etreelink='https://www.baidu.com/'headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/87.0.4280.88 ' 'Safari/537.36 Edg/87.0.664.66'}r=requests.get(url=link,headers=headers)html=etree.HTML(r.text)title_list=html.xpath('//span[@class="title-content-title"]/text()')print(title_list)
運行結果:
此例同為百度熱點
其中,「//span」代表選取所有<span>子元素,「//」無論在文檔中的什麼位置,後面加上[@class=」title-content-title」]表示選取<span>中class的「title-content-title」的元素,/text()表示提取<span>元素中的所有文本。
Xpath的選取方法——沿著路勁來選取的,如表:
上例子中「//span」:選取所有的span元素,無論它們在文檔中的什麼位置
關注我,獲取更多小技能!