一、簡(jiǎn)介
XPath 是一門(mén)在 XML 文檔中查找信息的語(yǔ)言。XPath 可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷缺脉。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素短荐,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上。
二细睡、安裝
1pip3 install lxml
三谷羞、使用
1、導(dǎo)入
1from?lxml?import?etree
2溜徙、基本使用
from?lxml?import?etree
wb_data?=?"""
????????"""
html?=?etree.HTML(wb_data)
print(html)
result?=?etree.tostring(html)
print(result.decode("utf-8"))
l?import?etree
wb_data?=?"""
????????"""
html?=?etree.HTML(wb_data)
print(html)
result?=?etree.tostring(html)
print(result.decode("utf-8"))
從下面的結(jié)果來(lái)看湃缎,我們打印機(jī)html其實(shí)就是一個(gè)python對(duì)象,etree.tostring(html)則是不全里html的基本寫(xiě)法蠢壹,補(bǔ)全了缺胳膊少腿的標(biāo)簽嗓违。
3、獲取某個(gè)標(biāo)簽的內(nèi)容(基本使用)图贸,注意蹂季,獲取a標(biāo)簽的所有內(nèi)容,a后面就不用再加正斜杠疏日,否則報(bào)錯(cuò)偿洁。
寫(xiě)法一
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('/html/body/div/ul/li/a')
print(html)
for?i?in?html_data:
????print(i.text)
寫(xiě)法二(直接在需要查找內(nèi)容的標(biāo)簽后面加一個(gè)/text()就行)
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('/html/body/div/ul/li/a/text()')
print(html)
for?i?in?html_data:
????print(i)
first item
second item
third item
fourth item
fifth item
4、打開(kāi)讀取html文件
#使用parse打開(kāi)html的文件
html?=?etree.parse('test.html')
html_data?=?html.xpath('//*')
#打印是一個(gè)列表沟优,需要遍歷
print(html_data)
for?i?in?html_data:
????print(i.text)
html?=?etree.parse('test.html')
html_data?=?etree.tostring(html,pretty_print=True)
res?=?html_data.decode('utf-8')
print(res)
5涕滋、打印指定路徑下a標(biāo)簽的屬性(可以通過(guò)遍歷拿到某個(gè)屬性的值,查找標(biāo)簽的內(nèi)容)
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('/html/body/div/ul/li/a/@href')
for?i?in?html_data:
????print(i)
打幽痈蟆:
link1.html
link2.html
link3.html
link4.html
link5.html
6宾肺、我們知道我們使用xpath拿到得都是一個(gè)個(gè)的ElementTree對(duì)象溯饵,所以如果需要查找內(nèi)容的話,還需要遍歷拿到數(shù)據(jù)的列表锨用。
查到絕對(duì)路徑下a標(biāo)簽屬性等于link2.html的內(nèi)容丰刊。
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()')
print(html_data)
for?i?in?html_data:
????print(i)
打印:
['second item']
second item
7增拥、上面我們找到全部都是絕對(duì)路徑(每一個(gè)都是從根開(kāi)始查找)啄巧,下面我們查找相對(duì)路徑,例如跪者,查找所有l(wèi)i標(biāo)簽下的a標(biāo)簽內(nèi)容棵帽。
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('//li/a/text()')
print(html_data)
for?i?in?html_data:
????print(i)
打印:
['first item',?'second item',?'third item',?'fourth item',?'fifth item']
first item
second item
third item
fourth item
fifth item
8渣玲、上面我們使用絕對(duì)路徑逗概,查找了所有a標(biāo)簽的屬性等于href屬性值,利用的是/---絕對(duì)路徑忘衍,下面我們使用相對(duì)路徑逾苫,查找一下l相對(duì)路徑下li標(biāo)簽下的a標(biāo)簽下的href屬性的值,注意枚钓,a標(biāo)簽后面需要雙//铅搓。
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('//li/a//@href')
print(html_data)
for?i?in?html_data:
????print(i)
打印:
['link1.html',?'link2.html',?'link3.html',?'link4.html',?'link5.html']
link1.html
link2.html
link3.html
link4.html
link5.html
9搀捷、相對(duì)路徑下跟絕對(duì)路徑下查特定屬性的方法類(lèi)似星掰,也可以說(shuō)相同。
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('//li/a[@href="link2.html"]')
print(html_data)
for?i?in?html_data:
????print(i.text)
打幽壑邸:
[]
second item
10氢烘、查找最后一個(gè)li標(biāo)簽里的a標(biāo)簽的href屬性
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('//li[last()]/a/text()')
print(html_data)
for?i?in?html_data:
????print(i)
打印:
['fifth item']
fifth item
11家厌、查找倒數(shù)第二個(gè)li標(biāo)簽里的a標(biāo)簽的href屬性
html?=?etree.HTML(wb_data)
html_data?=?html.xpath('//li[last()-1]/a/text()')
print(html_data)
for?i?in?html_data:
????print(i)
打硬ゾ痢:
['fourth item']
fourth item
12、如果在提取某個(gè)頁(yè)面的某個(gè)標(biāo)簽的xpath路徑的話饭于,可以如下圖:
//*[@id="kw"]?
解釋:使用相對(duì)路徑查找所有的標(biāo)簽蜀踏,屬性id等于kw的標(biāo)簽。