python爬蟲之lxml簡單學習使用方法
使用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內容:
..
<li class="name" id = "hahaha"> 哈哈哈<a href="'www.bai.com" id="a" ></a></li>
<li class="haha"></li>
..
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 | 選取此節點的所有子節點 |
/ | 下一節點 |
// | 從當前節點開始遞迴下降,此路徑運算子出現在模式開頭時,表示應從根節點遞迴下降。 |
. | 選取當前節點 |
.. | 選取當前節點的父節點 |
@ | 選取屬性 |
@* | 選取所有屬性 |
[] | 應用篩選模式,可以用來篩選想要的內容 |