版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Python使用XPath解析HTML的方法詳解目錄引言XPath語(yǔ)法XPath方法Python中使用XPath解析HTML文檔XPath表達(dá)式示例選擇節(jié)點(diǎn)謂詞運(yùn)算符示例代碼總結(jié)
引言
XPath是一種用于選擇XML文檔中節(jié)點(diǎn)的語(yǔ)言,它可以通過(guò)路徑表達(dá)式來(lái)定位節(jié)點(diǎn)。由于HTML文檔的結(jié)構(gòu)與XML文檔類似,XPath也可以用于解析HTML文檔。Python是一種非常流行的編程語(yǔ)言,它提供了許多庫(kù)用于解析HTML文檔。本文將介紹Python中使用XPath解析HTML文檔的方法和技巧。
XPath語(yǔ)法
XPath表達(dá)式組成
XPath的路徑表達(dá)式類似于文件系統(tǒng)中的路徑,它用于描述節(jié)點(diǎn)在文檔樹(shù)中的位置。XPath表達(dá)式由以下幾個(gè)部分組成:
標(biāo)簽名:標(biāo)簽名用于描述節(jié)點(diǎn)的類型,它可以是HTML標(biāo)簽名或XML標(biāo)簽名。例如,img表示圖片節(jié)點(diǎn),a表示鏈接節(jié)點(diǎn)。
軸:軸用于描述節(jié)點(diǎn)與當(dāng)前節(jié)點(diǎn)的關(guān)系,它可以是父節(jié)點(diǎn)、子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)等。
謂詞:謂詞用于描述節(jié)點(diǎn)的屬性或位置。
XPath方法
在lxml庫(kù)中,可以使用XPath方法來(lái)解析HTML文檔。XPath方法有以下幾種:
etree.HTML():將HTML字符串轉(zhuǎn)化為一個(gè)Element對(duì)象。find():返回第一個(gè)匹配的元素。findall():返回所有匹配的元素。xpath():返回所有匹配XPath表達(dá)式的元素。
Python中使用XPath解析HTML文檔
Python中有許多庫(kù)用于解析HTML文檔,其中比較流行的有BeautifulSoup和lxml。這兩個(gè)庫(kù)都支持使用XPath解析HTML文檔。在本文中,我們將使用lxml庫(kù)來(lái)解析HTML文檔。
安裝lxml庫(kù)
在使用lxml庫(kù)之前,需要先安裝它??梢允褂胮ip命令來(lái)安裝lxml庫(kù),命令如下:
pipinstalllxml
解析HTML文檔
在使用lxml庫(kù)解析HTML文檔之前,需要先將HTML文檔加載到內(nèi)存中。可以使用requests庫(kù)來(lái)加載HTML文檔,代碼如下:
importrequests
???????url=''
response=requests.get(url)
html=response.content
接下來(lái),我們將使用lxml庫(kù)來(lái)解析HTML文檔。代碼如下:
fromlxmlimportetree
將HTML文檔轉(zhuǎn)換為Element對(duì)象
element=etree.HTML(html)
使用XPath表達(dá)式來(lái)選擇節(jié)點(diǎn)
nodes=element.xpath('//a[@]')
遍歷節(jié)點(diǎn)并輸出節(jié)點(diǎn)的文本
fornodeinnodes:
print(node.text)
在上面的代碼中,我們使用etree.HTML()方法將HTML文檔轉(zhuǎn)換為Element對(duì)象。然后使用XPath表達(dá)式來(lái)選擇所有class屬性為link的a標(biāo)簽節(jié)點(diǎn)。最后遍歷所有節(jié)點(diǎn)并輸出節(jié)點(diǎn)的文本。
XPath表達(dá)式示例
下面我們將介紹一些常用的XPath表達(dá)式及其對(duì)應(yīng)的示例。
選擇節(jié)點(diǎn)
選擇所有節(jié)點(diǎn):
//*
選擇指定節(jié)點(diǎn):
//a
選擇指定節(jié)點(diǎn)和屬性:
//a[@href]
選擇指定節(jié)點(diǎn)和屬性值:
//a[@href=]
選擇指定節(jié)點(diǎn)和多個(gè)屬性值:
//a[@href=and@>
選擇指定節(jié)點(diǎn)和文本:
//a[text()=Link]
選擇父節(jié)點(diǎn):
../
選擇指定父節(jié)點(diǎn):
../div
選擇子節(jié)點(diǎn)
選擇子節(jié)點(diǎn):
/*
選擇指定子節(jié)點(diǎn):
/div
選擇兄弟節(jié)點(diǎn):
/following-sibling::*
選擇指定兄弟節(jié)點(diǎn):
/following-sibling::div
選擇前一個(gè)兄弟節(jié)點(diǎn):
/preceding-sibling::div[1]
謂詞
選擇屬性等于指定值的節(jié)點(diǎn):
//*[@>
選擇屬性不等于指定值的節(jié)點(diǎn):
//*[@class!=link]
選擇屬性包含指定值的節(jié)點(diǎn):
//*[contains(@class,link)]
選擇屬性以指定值開(kāi)頭的節(jié)點(diǎn):
//*[starts-with(@href,https://)]
選擇屬性以指定值結(jié)尾的節(jié)點(diǎn):
//*[ends-with(@href,.html)]
選擇指定位置的節(jié)點(diǎn):
//*[position()=3]
選擇指定范圍內(nèi)的節(jié)點(diǎn):
//*[position()2andposition()6]
運(yùn)算符
選擇屬性值為數(shù)字的節(jié)點(diǎn):
//*[starts-with(@id,item)and@id10]
選擇屬性值為數(shù)字的節(jié)點(diǎn)并按照屬性值排序:
//*[starts-with(@id,item)andnumber(@id)10]/@id|//*[starts-with(@id,item)andnumber(@id)10]/@class
示例代碼
fromlxmlimportetree
#構(gòu)造html
html_string='''
html
head
titleContainsTest/title
/head
body
divid="content"
h1Welcometomywebsite/h1
pThisisatestpagetodemonstratetheuseofcontainsinXPath./p
liahref="#"Link1/a/li
liahref="#"Link2/a/li
liahref="#"Link3/a/li
/ul
/div
/body
/html
#解析html
doc=etree.HTML(html_string)
#使用contains函數(shù)查找包含“test”的段落元素
p_elements=doc.xpath('//p[contains(text(),"test")]')
#打印結(jié)果
forpinp_elements:
print(p.text)
輸出結(jié)果為:
ThisisatestpagetodemonstratetheuseofcontainsinXPath.
除了使用contains函數(shù),我們還可以使用其他的xpath語(yǔ)法來(lái)解析html。以下是一些示例代碼:
1.查找所有鏈接元素
#使用xpath表達(dá)式選擇所有名稱為“a”的元素
link_elements=doc.xpath('//a')
#打印結(jié)果
forlinkinlink_elements:
print(link.text,link.get('href'))
輸出:
Link1#
Link2#
Link3#
2.查找所有列表項(xiàng)元素
#使用xpath表達(dá)式選擇所有名稱為“l(fā)i”下的a節(jié)點(diǎn)的元素
li_elements=doc.xpath('//li')
#打印結(jié)果
forliinli_elements:
print(etree.tostring(li))#'輸出節(jié)點(diǎn)'
print(li.xpath('./a/text()'))#'輸出a節(jié)點(diǎn)文本'
輸出:
3.查找所有帶有id屬性的元素
#使用xpath表達(dá)式選擇所有帶有id屬性的元素
id_elements=doc.xpath('//*[@id]')
#打印結(jié)果
forelementinid_elements:
print(element.tag,element.get('id'))
輸出:
divcontent
4.查找特定id的元素
#使用xpath表達(dá)式選擇id為“content”的元素
content_element=doc.xpath('//*[@id="content"]')[0]
#打印結(jié)果
print(content_element.tag,content_element.text)
輸出:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 24276-2025通過(guò)計(jì)算進(jìn)行低壓成套開(kāi)關(guān)設(shè)備和控制設(shè)備溫升驗(yàn)證的一種方法
- 2025年中職煙草栽培與加工(煙草技術(shù)專題)試題及答案
- 2025年大學(xué)交通運(yùn)輸(物流運(yùn)輸規(guī)劃)試題及答案
- 2025年大學(xué)農(nóng)村電氣技術(shù)(農(nóng)村新能源利用)試題及答案
- 2026年生物科技(基因編輯技術(shù))試題及答案
- 2025年高職獸醫(yī)服務(wù)(服務(wù)技術(shù))試題及答案
- 2025年高職(野生動(dòng)植物資源保護(hù)與利用)野生動(dòng)物監(jiān)測(cè)試題及答案
- 2025年中職護(hù)理(老年護(hù)理)試題及答案
- 2025年高職電網(wǎng)監(jiān)控技術(shù)(電網(wǎng)監(jiān)控操作)試題及答案
- 2025年高職(中藥購(gòu)銷員)中藥銷售綜合測(cè)試題及答案
- 商超信息系統(tǒng)操作規(guī)定
- 如何做好一名護(hù)理帶教老師
- 房地產(chǎn)項(xiàng)目回款策略與現(xiàn)金流管理
- 花溪區(qū)高坡苗族鄉(xiāng)國(guó)土空間總體規(guī)劃 (2021-2035)
- 非連續(xù)性文本閱讀(中考試題20篇)-2024年中考語(yǔ)文重難點(diǎn)復(fù)習(xí)攻略(解析版)
- 專題13 三角函數(shù)中的最值模型之胡不歸模型(原卷版)
- 門診藥房西藥管理制度
- 新能源汽車生產(chǎn)代工合同
- 2025年中煤科工集團(tuán)重慶研究院有限公司招聘筆試參考題庫(kù)含答案解析
- 消防救援預(yù)防職務(wù)犯罪
- 一體化泵站安裝施工方案
評(píng)論
0/150
提交評(píng)論