xpath 和 在 lxml 中應用 (做個小筆記)
阿新 • • 發佈:2021-01-13
#xpath
#xpath(XML Path Language)是一門在XML和HTML文件中查詢資訊的語言,可用來在XML和HTML文件中對元素和屬性進行遍歷。
#1.用法
'''
/ 代表逐層提取 例項 提取標題 /html/head/title
text() 提取標籤下的文字 例項 提取標題文字 /html/head/title/text()
//標籤名 提取所有名為**的標籤 例項 提取所有div標籤 //div
//標籤名[@屬性=‘屬性值’] 提取屬性名為**的標籤 例項 提取div中<div class="tools">標籤內容 //div[@class="tools"]/text()
@屬性名 代表某個屬性名 例項 提取新_我的訂單 //ul[@class="ddnewhead_gcard_list"]/li/a/@dd-name
'''
'''
路徑用法
謂語
/li/a[1] 即選取屬於 li 標籤下 第一個 a元素
/li/a[last()] 即選取屬於 li 標籤下 最後一個 a元素
/li/a[last()-1] 即選取屬於 li 標籤下 倒數第二個 a元素
/li/a[position()<3] 即選取屬於 li 標籤下 前兩個 a元素
/li/a[price>35.00] 即選取屬於 li 標籤下 a元素中pprice大於的元素
'''
'''
萬用字元
* 匹配任意節點
@* 匹配任意節點中的任何屬性
| 選取多個路徑 /li/a | /li/a/text() 選取所有 a元素 和 a元素下的文字資訊
'''
#2.lxml lxml 是 一個HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 資料。
from lxml import html
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
# 將字串解析為html文件
txt =html.etree.HTML(text)
print(txt) #type 為 <class 'lxml.etree._Element'>
# 按字串序列化html tostring
result = html.tostring(txt).decode('utf-8')
print(result) #type 為 str
'''#從檔案中提取
txt=html.etree.parse('檔名')
result=html.etree.tostring(txt).decode('utf-8')
print(result)'''
# xpath 在 lxml 中應用
from lxml import html
text='''
<html><body><p>html
<!-- hello.html -->
</p><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div></body></html>
'''
#txt=html.etree.HTML(text)
#result=html.etree.tostring(txt).decode('utf-8')
#print(result)
txt=html.etree.HTML(text)
#1. 獲取所有li標籤: 這個可以不重要理解吧 好像一般都用不了
result=txt.xpath('//ul/li')
'''這裡的的txt必須是html 的 格式 才能用xpath提取 得到的是一個列表'''
'''' 得到的像這樣 <Element li at 0x2d414722188> 是一個元素,它的型別是'lxml.etree._Element' 需要用 html.tostring() 取出內容
因為這個標籤下有很多內容 所以返回的是這個 如果路徑具體的話就不會是這個 而是具體的內容 '''
for i in range(0,len(result)):
realresult = html.tostring(result[i]).decode('utf-8')
print(realresult)
#2. 獲取所有li元素下的所有class屬性的值:
result=txt.xpath('//ul/li/@class')
print(result)
#3. 獲取li標籤下href為link2.html的a標籤:
result=txt.xpath('//ul/li[2]/a/@href') #也可以 '//ul/li[@class="item-1"][1]/a/@href'
print(result)
#4. 獲取li標籤下所有span標籤:
result=txt.xpath('//ul/li/a/span')
print(result)
#5. 獲取li標籤下的a標籤裡的所有class:
result=txt.xpath('//ul/li/a//@class')
print(result)
#6. 獲取最後一個li的a的href屬性對應的值:
result=txt.xpath('//ul/li[last()]/a/@href')
print(result)
# 7. 獲取倒數第二個li元素的內容:
result=txt.xpath('//ul/li[last()-1]/a')
print(result[0].text) #因為得到的 列表 所以 第一個元素 即為所求
#8. 獲取倒數第二個li元素的內容的第二種方式:
result=txt.xpath('//ul/li[last()-1]/a/text()')
print(result)