使用BeautifulSoup和lxml,可以解析代碼並不規範的網頁,並補充代碼方便解析。使用過BeatuifulSoup解析網頁,解析速度上並沒有lxml快,本人爬取過一個網站,用aiohttp+BeautifulSoup,協程一起爬20多個網頁,由於解析超時會中斷,改用lxml後,就沒有出現這個問題,爬取速度提升了數倍。
使用lxml步驟:
1,引入包:from lxml import etree
2,解析獲得的網頁:html = etree.HTML(要解析的網頁或文本)
3,使用etree匹配獲得要取得的內容:
例如:獲得 html中所有的li內容:
li = html.xpath('//li')
下面是一份完整代碼:
假設html內容如下:
<html>
<head></head>
<title>***</title>
<body>
...
<li class="name" id = "hahaha"> 哈哈哈<a href="'www.bai.com" id="a" ></a></li>
<li class="haha"></li>
...
</body>
</html>
python代碼:
from lxml import etree
html = etree.HTML(html)
li = html.xpath('//li/@class') #代表從根目錄尋找所有li的class屬性,輸出 ['name','haha']
print(html.xpath('//li[contains(@class,"name")]/text()') ) #從根目錄尋找class爲name的li下的文本,輸出爲哈哈哈
print(li.xpath('./a/@href')) #從li節點開始尋找所有的a節點的href,輸出爲www.bai.com
print(li[0].attrib) #輸出li[0]的屬性,輸出爲{"class":"name","id":"haha"}
常用的符號如下,跟shell尋找目錄路徑規則相似:
表達式 | 描述 |
nodename | 選取此節點的所有子節點 |
/ | 下一節點 |
// | 從當前節點開始遞歸下降,此路徑運算符出現在模式開頭時,表示應從根節點遞歸下降。 |
. | 選取當前節點 |
.. | 選取當前節點的父節點 |
@ | 選取屬性 |
@* | 選取所有屬性 |
[] | 應用篩選模式,可以用來篩選想要的內容 |