1. 程式人生 > 其它 >Xpath模組使用和實戰豬八戒

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')