Xpath模組使用和實戰豬八戒
Xpath模組使用和實戰豬八戒
- xpath的模組使用
- xpath的瞭解知識
xpath模組使用
實驗準備
該程式碼用於下列實驗操作
doc = ''' <html> <head> <base href='http://example.com/' /> <title id='t1'>Example website</title> </head> <body> <div id='images'> <a href='image1.html' a="xxx">Name: My image 1 <br /><img src='image1_thumb.jpg' /></a> <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a> <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a> <a href='image4.html' class='li'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a> <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a> <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a> </div> </body> </html>'''
xpath的特點
效率高,使用廣
呼叫模組
匯入xpath所在模組
from lxml import etree
生成物件
將待匹配的文字傳入etree生成一個物件
語法:
html = etree.HTML(變數名)
eg:
html = etree.HTML(doc)
獲取標籤
1.所有標籤
eg:
a = html.xpath('//*') print(a)
2.指定節點(結果為列表)
語法:
a = html.xpath('//標籤名')
eg:
a = html.xpath('//a') print(a)
3.子節點,子孫節點
eg:
匹配div標籤內部所有的兒子a標籤
a = html.xpath('//div/a')
匹配body標籤內部所有的兒子a標籤
a = html.xpath('//body/a')
匹配body標籤內容所有的後代a標籤
a = html.xpath('//body//a')
4.父節點
獲取body內部所有href=image1.html的後代a
a = html.xpath('//body//a[@href="image1.html"]') print(a)
..表示查詢上一級父標籤,獲取body內部所有href=image1.html的後代a的父標籤
a = html.xpath('//body//a[@href="image1.html"]/..') print(a)
獲取所有id="t1"的title的父標籤
a = html.xpath('//title[@id="t1"]/..') print(a)
匹配body標籤內容所有的後代a標籤的第一個
''' xpath返回列表值從1開始取值 ''' a = html.xpath('//body//a[1]')
print(a)
也可以這樣(瞭解)
匹配body標籤內容所有的後代a標籤的第一個的父親標籤
a = html.xpath('//body//a[1]/parent::*')
print(a)
5.文字獲取
獲取body內部所有href=image1.html的後代a的文字內容
a = html.xpath('//body//a[@href="image1.html"]/text()') print(a)
獲取body內部所有後代a內部文字(一次性獲取不需要迴圈)
a = html.xpath('//body//a/text()')
6 屬性獲取
獲取title標籤id屬性值
a = html.xpath('//title/@id')
注意從1 開始取(不是從0),獲取body中兒子a標籤的href屬性值
a = html.xpath('//body//a/@href')
注意從1 開始取(不是從0),獲取body中兒子a標籤的第二個的href屬性值
a = html.xpath('//body//a[2]/@href')
7 屬性多值匹配
a = html.xpath('//body//a[@class="li"]') print(a)
有些a標籤有多個class類,直接匹配就不可以了,需要用contains
a = html.xpath('//body//a[contains(@class,"li")]') print(a)
8 多屬性匹配
查詢body標籤內部所有class含有li或者name=items的a標籤
a = html.xpath('//body//a[contains(@class,"li")or@name="items"]')
查詢body標籤內部所有class含有li並且name=items的a標籤的內部文字
a = html.xpath('//body//a[contains(@class,"li")and @name="items"]')
9按序選擇
爬取a標籤中的最後一個的href的屬性值
a = html.xpath('//a[last()]/@href')
position
position()關鍵字,用於定位
爬取a標籤中位置小於3的href問題
a=html.xpath('//a[position()<3]/@href')
倒數第三個
a=html.xpath('//a[last()-2]/@href')
xpath的瞭解知識
ancestor:祖先節點
獲取a標籤的所有祖先結點
# 使用了* 獲取所有祖先節點
a=html.xpath('//a/ancestor::*')
獲取祖先節點中的div
a=html.xpath('//a/ancestor::div')
attribute:屬性值
查詢a標籤內部第一個的屬性值
a=html.xpath('//a[1]/attribute::*')
child:直接子節點
查詢a標籤內部第一個的兒子節點
a=html.xpath('//a[1]/child::*')
descendant:所有子孫節點
查詢div標籤內部所有的子孫節點
a=html.xpath('//div[@id='images']/descendant::*')
following:當前節點之後所有節點
獲取a標籤的第一個之後的節點
a=html.xpath('//a[1]/following::*')
獲取a標籤的第一個之後的節點中第一個的href屬性內容
a=html.xpath('//a[1]/following::*[1]/@href')
following-sibling:當前節點之後同級節點
獲取a標籤的第一個之後的同級節點
a=html.xpath('//a[1]/following-sibling::*')
獲取a標籤的第一個之後的同級a節點
a = html.xpath('//a[1]/following-sibling::a')
獲取a標籤的第一個之後的同級節點中的第二個的文字
a=html.xpath('//a[1]/following-sibling::*[2]/text()')
獲取a標籤的第一個之後的同級節點中的第二個的href屬性值
a=html.xpath('//a[1]/following-sibling::*[2]/@href')