【Python技能樹共建】lxml 模塊 R2
Python lxml 模塊
lxml 庫是一款 Python 數(shù)據(jù)解析庫,參考重要文檔在 https://lxml.de/,項(xiàng)目開源地址在:https://github.com/lxml/lxml,在一頓檢索之后,發(fā)現(xiàn) lxml 沒有中文相關(guān)手冊(cè),不過好在英文文檔閱讀難度不大,我們可以直接進(jìn)行學(xué)習(xí)。
怎么用
lxml.etree
縱覽之前的博客內(nèi)容,出場(chǎng)率最高的就是 lxml.etree ,其次就是 Element 對(duì)象,我們?cè)诮馕鰯?shù)據(jù)的時(shí)候,大量的代碼都是基于 Element 對(duì)象的 API 實(shí)現(xiàn)。
在爬蟲代碼采集過程中,通過 etree.HTML 直接將字符串實(shí)例化為 element 對(duì)象。
import requests from lxml import etree res = requests.get("http://www.jsons.cn/zt/") html = res.text root_element = etree.HTML(html) print(root_element) print(root_element.tag)
上述代碼輸出內(nèi)容如下所示:
其中需要注意的是 Element 后面的 html,該字符串表示對(duì)象的標(biāo)簽名為 html,如果使用下述代碼:
print(root_element[1])
上述內(nèi)容得到的是
print("*"*100) for child in root_element: print(child.tag)
上述代碼輸出的內(nèi)容為:
head body
該輸出表示在 html 標(biāo)簽中,只包含head 與 body 標(biāo)簽,實(shí)際情況也確實(shí)如此,為了驗(yàn)證,你可以在 循環(huán)中繼續(xù)嵌套一層。
此時(shí)輸出的內(nèi)容就變得豐富了需求,如下圖所示:
你也可以通過 etree.tostring(element對(duì)象) 直接將該對(duì)象轉(zhuǎn)換為字符串進(jìn)行輸出。
for child in root_element: for item in child: print(item.tag) print(etree.tostring(item))
XPath
lxml 庫可以配合其他的解析引擎進(jìn)行工作,首次接觸的就是 XPath,關(guān)于 XPath 相關(guān)的知識(shí),我們后續(xù)博客會(huì)細(xì)化學(xué)習(xí),本節(jié)課依舊從 lxml 的角度出發(fā),為你介紹。
在爬蟲代碼編寫中,直接使用 html.xpath("xpath表達(dá)式") 即可獲取目標(biāo)數(shù)據(jù),例如獲取網(wǎng)頁 title。
print(root_element.xpath('//title'))
獲取網(wǎng)頁所有文本:
print(root_element.xpath('string()'))
獲取到 element 對(duì)象之后,可調(diào)用 text 屬性,獲取對(duì)應(yīng)文本,在使用的時(shí)候,需要注意使用 XPath 獲取到的 element 對(duì)象,都是列表。
title_element = root_element.xpath('//title') print(title_element[0].text)
在 lxml 中,還內(nèi)置了一款 簡(jiǎn)單的類似 XPath 的路徑語言,稱為 ElementPath,例如查詢 title,需要從 head 開始檢索,否則返回 None。
print(root_element[0].find("title"))
官方提供的方法如下:
iterfind(): 返回查找到的數(shù)據(jù),迭代器形式返回;
findall(): 返回匹配到的列表;
find(): 返回第一個(gè)匹配到的數(shù)據(jù);
findtext(): 返回匹配到的文本數(shù)據(jù),第一個(gè)。
lxml 擴(kuò)展知識(shí)
lxml 除了可以配合 XPath 實(shí)現(xiàn)數(shù)據(jù)解析外,還可以與 cssselect ,BeautifulSoup,html5lib 配合使用,這部分在后續(xù)的案例中,將逐步進(jìn)行展開。
lxml 在爬蟲領(lǐng)域,更多的是在提取數(shù)據(jù),因此較于該庫本身,掌握 XPath 等解析表達(dá)式的寫法更加重要。
鑒于該庫手冊(cè)沒有被翻譯,后期可以嘗試將其翻譯為中文。
HTML Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。