python中xpath的基本使用
寫在前面的話 :上一篇文章我們利用requests進行了一些爬蟲小實驗,但是想要更順利的深入爬蟲學習,了解一些解析網頁的方法肯定是必須的,所以接下來我們就一起來學習lxml.etree模塊的基礎使用方法吧
溫馨提示 :博主使用的系統為win10,使用的python版本為3.6.5
一、XPATH簡介
若想了解xpath,我們首先需要知道什麽是xml文檔,其實簡單地說,xml文檔就是由一系列節點構成的樹,例如
<html> <body> <div> <p>Hello world<p> <a href="/home">Click here</a> </div> </body> </html>
xml文檔常見的節點有
- 根節點:html
- 元素節點:html、body、div、p、a
- 屬性節點:href
- 文本節點:Hello world、Click here
xml文檔常見的節點間關系有
- 父子:p和a是div的子節點,反之,div是p和a的父節點
- 兄弟:p和a為兄弟節點
- 祖先/後代:body、div、p、a都是html的後裔節點,反之,html是body、div、p、a的祖先節點
而xpath則是一種用來確定xml文檔中某部分位置的語言,它的全稱是XML路徑語言(XML Path Language),對於網頁解析來說,xpath比正則表達式來得更方便更簡潔,故python中專門提供了一個特殊的模塊——lxml庫中的etree模塊用於處理xpath,我們可以使用以下命令進行安裝
$ pip install lxml
二、XPATH的基本使用方法
1. 導入模塊
>>> from lxml import etree
在這裏為了簡便起見,我們自己構造一個簡單的xml文檔
>>> sc = ‘‘‘ <html> <head> <meta charset=UTF-8> <link rel=stylesheet href=style/base.css> <link rel=stylesheet href=style/home.css> <base href="https://www.example.com"/> <title>Example website</title> <body> <div id="images" class="content"> <a href="image1.html">Image1<br/><img src="image1.jpg"/> <a href="image2.html">Image2<br/><img src="image2.jpg"/> <a href="image3.html">Image3<br/><img src="image3.jpg"/> <a href="image4.html">Image4<br/><img src="image4.jpg"/> <a href="image5.html">Image5<br/><img src="image5.jpg"/> ‘‘‘
2. 構造_Element對象
#可以使用HTML()方法構造_Element對象並自動補全不完整代碼
>>> html = etree.HTML(sc)
#構造對象結果檢查
>>> type(html)
<class ‘lxml.etree._Element‘>
#補全代碼結果檢查,註意tostring()方法用於將_Element對象轉化成bytes類型字符串,decode(‘utf-8‘)方法用於將bytes類型字符串轉化為str類型字符串
>>> print(etree.tostring(html).decode(‘utf-8‘))
<html>
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="style/base.css"/>
<link rel="stylesheet" href="style/home.css"/>
<base href="https://www.example.com"/>
<title>Example website</title>
</head>
<body>
<div id="images" class="content">
<a href="image1.html">Image1<br/><img src="image1.jpg"/></a>
<a href="image2.html">Image2<br/><img src="image2.jpg"/></a>
<a href="image3.html">Image3<br/><img src="image3.jpg"/></a>
<a href="image5.html">Image5<br/><img src="image5.jpg"/></a>
</div>
</body>
</html>
3. 匹配結果
可以使用xpath()方法進行匹配,註意該方法返回匹配列表,且列表中的每一項都是_Element對象
(1)/
表示子代,例如E1/E2表示E1子節點中的E2節點,/E表示文檔子節點中的E節點
>>> test = html.xpath(‘/html/body/div/a‘)
>>> print(test)
[<Element a at 0x3843bc0>, <Element a at 0x3843c10>, <Element a at 0x3843c38>, <Element a at 0x3843c60>, <Element a at 0x3843c88>]
(2)//
表示後代,例如E1//E2表示E1後代節點中的E2節點,//E表示文檔後代節點中的E節點
>>> test = html.xpath(‘//a‘)
>>> print(test)
[<Element a at 0x3843bc0>, <Element a at 0x3843c10>, <Element a at 0x3843c38>, <Element a at 0x3843c60>, <Element a at 0x3843c88>]
(3)*
表示屬性節點,例如E/*表示E子節點中的所有節點
>>> test = html.xpath(‘/html/*‘)
>>> print(test)
[<Element head at 0x3843be8>, <Element body at 0x3843c10>]
(4)text()
表示文本節點,例如E/text()表示E子節點中的文本節點
>>> test = html.xpath(‘/html/head/title/text()‘)
>>> print(test)
[‘Example website‘]
(5)@ATTR
表示屬性節點,例如E/@ATTR表示E子節點中的ATTR屬性節點
>>> test = html.xpath(‘//a/@href‘)
>>> print(test)
[‘image1.html‘, ‘image2.html‘, ‘image3.html‘, ‘image4.html‘, ‘image5.html‘]
(6)謂語
用於匹配指定的標簽
#指定第二個a標簽
>>> test = html.xpath(‘//a[2]‘)
>>> print(test)
[<Element a at 0x3843c88>]
#指定前兩個a標簽
>>> test = html.xpath(‘//a[position()<=2]‘)
>>> print(test)
[<Element a at 0x3843c60>, <Element a at 0x3843c88>]
#指定帶有href屬性的a標簽
>>> test = html.xpath(‘//a[@href]‘)
>>> print(test)
[<Element a at 0x3843c38>, <Element a at 0x385c300>, <Element a at 0x385c2d8>, <Element a at 0x385c350>, <Element a at 0x385c328>]
#指定帶有href屬性且值為image1.html的a標簽
>>> test = html.xpath(‘//a[@href="image1.html"]‘)
>>> print(test)
[<Element a at 0x3843c38>]
4. _Element對象的常用屬性與方法
我們先用xpath()方法得到匹配列表tests,tests中的每一項都是一個 _Element對象
>>> tests = html.xpath(‘//a‘)
(1)屬性tag
返回標簽名
>>> for test in tests:
test.tag
‘a‘
‘a‘
‘a‘
‘a‘
‘a‘
(2)屬性 attrib
返回屬性與值組成的字典
>>> for test in tests:
test.attrib
{‘href‘: ‘image1.html‘}
{‘href‘: ‘image2.html‘}
{‘href‘: ‘image3.html‘}
{‘href‘: ‘image4.html‘}
{‘href‘: ‘image5.html‘}
(3)方法 get()
返回指定屬性的值
>>> for test in tests:
test.get(‘href‘)
‘image1.html‘
‘image2.html‘
‘image3.html‘
‘image4.html‘
‘image5.html‘
(4)屬性 text
返回文本值
>>> for test in tests:
test.text
‘Image1‘
‘Image2‘
‘Image3‘
‘Image4‘
‘Image5‘
寫在後面的話 :現在我們已經學習完requests和lxml.etree模塊的基礎使用方法了,下一篇文章我們將利用它們進行一個基礎的爬蟲實戰訓練,謝謝大家
python中xpath的基本使用