精彩不停!Python解析庫lxml與xpath用法總結(jié)
4.xpath 軸
軸可定義相對(duì)于當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)集。
軸名稱結(jié)果ancestor選取當(dāng)前節(jié)點(diǎn)的所有先輩(父、祖父等)。ancestor-or-self選取當(dāng)前節(jié)點(diǎn)的所有先輩(父、祖父等)以及當(dāng)前節(jié)點(diǎn)本身。attribute選取當(dāng)前節(jié)點(diǎn)的所有屬性。child選取當(dāng)前節(jié)點(diǎn)的所有子元素。descendant選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子、孫等)。descendant-or-self選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子、孫等)以及當(dāng)前節(jié)點(diǎn)本身。following選取文檔中當(dāng)前節(jié)點(diǎn)的結(jié)束標(biāo)簽之后的所有節(jié)點(diǎn)。namespace選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn)。parent選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。preceding選取文檔中當(dāng)前節(jié)點(diǎn)的開始標(biāo)簽之前的所有節(jié)點(diǎn)。preceding-sibling選取當(dāng)前節(jié)點(diǎn)之前的所有同級(jí)節(jié)點(diǎn)。self選取當(dāng)前節(jié)點(diǎn)。
5.xpath運(yùn)算符
下面列出了可用在 XPath 表達(dá)式中的運(yùn)算符:
運(yùn)算符描述實(shí)例返回值|計(jì)算兩個(gè)節(jié)點(diǎn)集//book | //cd返回所有擁有 book 和 cd 元素的節(jié)點(diǎn)集+加法6 + 410-減法6 - 42*乘法6 * 424div除法8 div 42=等于price=9.80如果 price 是 9.80,則返回 true。如果 price 是 9.90,則返回 false。!=不等于price!=9.80如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。<小于price<9.80如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。<=小于或等于price<=9.80如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。>大于price>9.80如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。>=大于或等于price>=9.80如果 price 是 9.90,則返回 true。如果 price 是 9.70,則返回 false。or或price=9.80 or price=9.70如果 price 是 9.80,則返回 true。如果 price 是 9.50,則返回 false。and與price>9.00 and price<9.90如果 price 是 9.80,則返回 true。如果 price 是 8.50,則返回 false。mod計(jì)算除法的余數(shù)5 mod 21
好了,xpath的內(nèi)容就這么多了。接下來我們要介紹一個(gè)神器lxml,他的速度很快,曾經(jīng)一直是我使用beautifulsoup時(shí)最鐘愛的解析器,沒有之一,因?yàn)樗乃俣鹊拇_比其他的html.parser 和html5lib快了許多。
二、lxml
1.lxml安裝
lxml 是一個(gè)xpath格式解析模塊,安裝很方便,直接pip install lxml 或者easy_install lxml即可。
2.lxml 使用
lxml提供了兩種解析網(wǎng)頁的方式,一種是你解析自己寫的離線網(wǎng)頁時(shí),另一種 則是解析線上網(wǎng)頁。
導(dǎo)入包:
from lxml import etree
1.解析離線網(wǎng)頁:
html=etree.parse('xx.html',etree.HTMLParser())aa=html.xpath('/[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')print(aa)
2.解析在線網(wǎng)頁:
from lxml import etreeimport requestsrep=requests.get('https://www.baidu.com')html=etree.HTML(rep.text)aa=html.xpath('/[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')print(aa)
那么我們?cè)趺传@取這些標(biāo)簽和標(biāo)簽對(duì)應(yīng)的屬性值了,很簡單,首先獲取標(biāo)簽只需你這樣做:

然后我們可以,比方說,你要獲取a標(biāo)簽內(nèi)的文本和它的屬性href所對(duì)應(yīng)的值,有兩種方法,
1.表達(dá)式內(nèi)獲取
aa=html.xpath('/[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/text()')
ab=html.xpath('/[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')
2.表達(dá)式外獲取
aa=html.xpath('/[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]')
aa.text
aa.a(chǎn)ttrib.get('href')
這樣就完成了獲取,怎么樣,是不是很簡單了,哈哈哈。
下面再來lxml的解析規(guī)則:
表達(dá)式描述nodename選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)/從當(dāng)前節(jié)點(diǎn)選取直接子節(jié)點(diǎn)//從當(dāng)前節(jié)點(diǎn)選取子孫節(jié)點(diǎn).選取當(dāng)前節(jié)點(diǎn)..選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)@選取屬性
html = lxml.etree.HTML(text)#使用text構(gòu)造一個(gè)XPath解析對(duì)象,etree模塊可以自動(dòng)修正HTML文本html = lxml.etree.parse('./ex.html',etree.HTMLParser())#直接讀取文本進(jìn)行解析from lxml import etreeresult = html.xpath('/')#選取所有節(jié)點(diǎn)result = html.xpath('//li')#獲取所有l(wèi)i節(jié)點(diǎn)result = html.xpath('//li/a')#獲取所有l(wèi)i節(jié)點(diǎn)的直接a子節(jié)點(diǎn)result = html.xpath('//li//a')#獲取所有l(wèi)i節(jié)點(diǎn)的所有a子孫節(jié)點(diǎn)result = html.xpath('//a[@href="link.html"]/../@class')#獲取所有href屬性為link.html的a節(jié)點(diǎn)的父節(jié)點(diǎn)的class屬性result = html.xpath('//li[@class="ni"]')#獲取所有class屬性為ni的li節(jié)點(diǎn)result = html.xpath('//li/text()')#獲取所有l(wèi)i節(jié)點(diǎn)的文本result = html.xpath('//li/a/@href')#獲取所有l(wèi)i節(jié)點(diǎn)的a節(jié)點(diǎn)的href屬性result = html.xpath('//li[contains(@class,"li")]/a/text())#當(dāng)li的class屬性有多個(gè)值時(shí),需用contains函數(shù)完成匹配result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')#多屬性匹配result = html.xpath('//li[1]/a/text()')result = html.xpath('//li[last()]/a/text()')result = html.xpath('//li[position()<3]/a/text()')result = html.xpath('//li[last()-2]/a/text()')#按序選擇,中括號(hào)內(nèi)為XPath提供的函數(shù)result = html.xpath('//li[1]/ancestor::*')#獲取祖先節(jié)點(diǎn)result = html.xpath('//li[1]/ancestor::div')result = html.xpath('//li[1]/attribute::*')#獲取屬性值result = html.xpath('//li[1]/child::a[@href="link1.html"]')#獲取直接子節(jié)點(diǎn)result = html.xpath('//li[1]/descendant::span')#獲取所有子孫節(jié)點(diǎn)result = html.xpath('//li[1]/following::*[2]')#獲取當(dāng)前節(jié)點(diǎn)之后的所有節(jié)點(diǎn)的第二個(gè)result = html.xpath('//li[1]/following-sibling::*')#獲取后續(xù)所有同級(jí)節(jié)點(diǎn)
3.lxml案例
為了偷懶,小編決定還是采用urllib那篇文章的代碼,哈哈哈,機(jī)智如我。

好了,今天就講這么多,大家感興趣的話可以多多關(guān)注哦,精彩不停息!!!!

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級(jí)工廠來了
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬
-

長安汽車母公司突然更名:從“中國長安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動(dòng)更多
-
6月30日立即申請(qǐng)?jiān)囉?> 【免費(fèi)試用】旭之源工業(yè)電源一一機(jī)器人的穩(wěn)定“心臟“
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)】物理場(chǎng)仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測(cè)未來·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會(huì)
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國機(jī)器人產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國機(jī)器人行業(yè)年度評(píng)選
推薦專題
-
2 華為,重大突破!
- 1 人形機(jī)器人“第一股”來了!宇樹科技即將上會(huì)
- 2 全球股市陷AI獨(dú)大結(jié)構(gòu)性瘋狂
- 3 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 4 DeepSeek融資500億,梁文鋒難逃資本局
- 5 谷歌2026 I/O大會(huì)完整回顧:模型依然重要,但智能體正在接管一切
- 6 全球資本,重倉中國機(jī)器人
- 7 Figure AI 交付突破350臺(tái),陪跑特斯拉會(huì)迎來iPhone 時(shí)刻嗎?
- 8 Anthropic發(fā)布2028年全球AI領(lǐng)導(dǎo)力的兩種情景報(bào)告
- 9 “國產(chǎn)GPU第一股”摩爾線程首季扭虧,但造血能力仍待考驗(yàn)
- 10 特斯拉宣布監(jiān)督版FSD登陸中國?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





