使用 Xpath 進(jìn)行爬蟲開發(fā)
Xpath( XML Path Language, XML路徑語(yǔ)言),是一種在 XML 數(shù)據(jù)中查找信息的語(yǔ)言,現(xiàn)在,我們也可以使用它在 HTML 中查找需要的信息。
既然談到 Xpath 是一門語(yǔ)言,當(dāng)然它就會(huì)有自己的一些特定的語(yǔ)法。我們這里羅列一些經(jīng)常使用的語(yǔ)法,熟悉下面的基本語(yǔ)法之后,就能滿足我們?nèi)粘5呐老x開發(fā)所用。
本小節(jié)主要內(nèi)容:
- Xpath的基本概念
- Xpath的基本語(yǔ)法
- Xpath實(shí)戰(zhàn)
學(xué)習(xí)目標(biāo):
熟練掌握常用的 Xpath 的基本操作
1. 開發(fā)前的準(zhǔn)備
前面我們介紹的 XPath 基本的語(yǔ)法和基本操作,下面我們通過(guò) lxml 庫(kù),來(lái)熟悉一下 XPath 的使用。
首先,我們需要一個(gè)測(cè)試文件,文件如下,文件名為 xpath_test.xml:
<!--- 這是一個(gè)測(cè)試數(shù)據(jù),方便我們后面進(jìn)行解析-->
<div>
<ul>
<li class='item-0'><a href='a.html'>python item</a></li>
<li class='item-1'><a href='b.html'>java item</a></li>
<li class='item-inactive'><a href='c.html'><span class='bold'>C item</span></a></li>
<li class='item-1'><a href='d.html'>java item</a></li>
<li class='item-0'><a href='b.html'>java item</a></li>
<li class='item-0'><a href='b.html'>java item</a></li>
</ul>
</div>
2. 基本語(yǔ)法
2.1 節(jié)點(diǎn)之間的關(guān)系
- 父節(jié)點(diǎn):每個(gè)元素都有一個(gè)父親節(jié)點(diǎn);
- 子節(jié)點(diǎn):每個(gè)元素節(jié)點(diǎn)可以有零個(gè),一個(gè)或者多個(gè)父親節(jié)點(diǎn);
- 兄弟節(jié)點(diǎn):相同父親節(jié)點(diǎn)的節(jié)點(diǎn);
- 先輩節(jié)點(diǎn):一個(gè)元素的父親節(jié)點(diǎn)的父親節(jié)點(diǎn);
- 后輩節(jié)點(diǎn):一個(gè)元素的子節(jié)點(diǎn)的子節(jié)點(diǎn)。
表達(dá)式基本語(yǔ)法
表達(dá)式 | 功能簡(jiǎn)介 |
---|---|
node | 選取node下面的所有的節(jié)點(diǎn) |
/node | 斜杠是代表絕對(duì)路徑,這個(gè)表達(dá)式語(yǔ)法的意思就是選擇根上的node |
//node | 選擇所有的node的節(jié)點(diǎn),與XML的位置無(wú)關(guān) |
. | 選擇當(dāng)前節(jié)點(diǎn) |
… | 選擇當(dāng)前節(jié)點(diǎn)的父親節(jié)點(diǎn) |
node/child | 選取node子節(jié)點(diǎn)的所有的child元素 |
node//child | 選取所有后備節(jié)點(diǎn)的chiid信息 |
//@href | 選取所有的href的屬性 |
2.2 謂語(yǔ)與通配符
表達(dá)式 | 功能簡(jiǎn)介 |
---|---|
/books/python[1] | 選取books子元素中的第一個(gè)python元素 |
/books/python[last()] | 選取books子元素中的最后一個(gè)元素 |
/books/python[position()<10] | 選取books子元素的前9個(gè)元素 |
. | 選擇當(dāng)前節(jié)點(diǎn) |
… | 選擇當(dāng)前節(jié)點(diǎn)的父親節(jié)點(diǎn) |
node/child | 選取node子節(jié)點(diǎn)的所有的child元素 |
node//child | 選取所有后備節(jié)點(diǎn)的chiid信息 |
//@href | 選取所有的href的屬性 |
3. 開發(fā)案例
開發(fā)案例一:
- 從xml中查找出所有的’li’標(biāo)簽
from lxml import etree
emt = etree.parse('text.xml')
rst = emt.xpath('//li')
運(yùn)行結(jié)果如下圖所示:
開發(fā)案例二:
- 從xml中查找出所有的’li’標(biāo)簽的所有class
from lxml import etree
emt = etree.parse('text.xml')
rst = emt.xpath('//li/@class')
運(yùn)行結(jié)果如下圖所示:
開發(fā)案例三:
- 從xml中查找出所有的’li’標(biāo)簽下面的href為a.html的標(biāo)簽
from lxml import etree
emt = etree.parse('text.xml')
rst = emt.xpath('//li/a[@href="a.html"]')
運(yùn)行結(jié)果如下圖所示:
4. 小結(jié)
XPath 是一種查詢語(yǔ)言,它是通過(guò)路徑來(lái)尋找相應(yīng)的信息,正如它的英文名稱 path 一樣,通過(guò)不同種X路徑,最終找到自己需要的信息。通過(guò) XPath,我們不但可以搜索 XML,也可以搜索 HTML。
通過(guò)案例,我們基本熟悉了 XPath 的基本使用,這也為我們后面學(xué)習(xí) BeautifulSoup 打下了良好的基礎(chǔ),XPath 為我們從復(fù)雜的文檔中,快速定位信息提供了良好的支持,也為我們后面處理和整理爬蟲爬下來(lái)的信息奠定了根基。