前言
這一章節主要講解Xpath的基礎語法,學習如何通過Xpath獲取網頁中我們想要的內容;爲我們的後面學習Java網絡爬蟲基礎準備工作。
備註:此章節爲基礎核心章節,未來會在網絡爬蟲的數據解析環節經常使用,學會Xpath解析語法,可爲未來爬蟲解析省去很多麻煩。
Xpath簡介
XPath即爲XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基於XML的樹狀結構,有不同類型的節點,包括元素節點,屬性節點和文本節點,提供在數據結構樹中找尋節點的能力。起初 XPath 的提出的初衷是將其作爲一個通用的、介於XPointer與XSLT間的語法模型。但是 XPath 很快的被開發者採用來當作小型查詢語言。
簡單來說我們通過Xpath可以獲取XML中的指定元素和指定節點的值。在網絡爬蟲中我們通過會把爬蟲獲取的HTML數據轉換成XML結構,然後通過XPath解析,獲取我們想要的結果。
接下來爲大家分享以下xpath的表達式以及用法。
一.選取節點
Xpath使用路徑表達式在XML文檔中選取節點。節點是通過沿着路徑來選取的,通過路徑可以找到我們想要的節點或者節點範圍。
表達式 |
描述 |
用法 |
說明 |
nodename |
選取此節點的所有子節點。 |
xpath(‘span’) |
選取span元素的所有子節點 |
/ |
從根節點選取 |
xpath(‘/div’) |
從根節點上選取div節點 |
// |
從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
|
xpath(‘//div’) |
從當前節點選取含有div節點的標籤 |
. |
選取當前節點 |
xpath(‘./div’) |
選取當前節點下的div標籤 |
.. |
選取當前節點的父節點 |
xpath(‘../’) |
回到上一級節點 |
@ |
選取屬性 |
xpath(“//div[@id=’1001’]”) |
獲取div標籤中,含有ID屬性且值爲1001的標籤 |
二.謂語(Predicates)
謂語用來查找某個特定的節點或者包含某個指定的值的節點。
謂語被嵌在方括號中。
表達式描述 |
用法說明 |
/bookstore/book[1] |
選取屬於 bookstore 子元素的第一個 book 元素。 |
/bookstore/book[last()] |
選取屬於 bookstore 子元素的最後一個 book 元素。 |
/bookstore/book[last()-1] |
選取屬於 bookstore 子元素的倒數第二個 book 元素。 |
/bookstore/book[position()<3] |
選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素。 |
//title[@lang] |
選取所有擁有名爲 lang 的屬性的 title 元素。 |
//title[@lang='eng'] |
選取所有 title 元素,且這些元素擁有值爲 eng 的 lang 屬性。 |
/bookstore/book[price>35.00] |
選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。 |
/bookstore/book[price>35.00]/title |
選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。 |
三. 通配符
XPath 通配符可用來選取未知的 XML 元素,通配指定節點。
表達式 |
描述 |
用法 |
說明 |
* |
匹配任何元素節點 |
xpath(/div/*) |
選取div下的所有子節點 |
@* |
匹配任何屬性節點 |
xpath(/div[@*]) |
選取所有帶屬性的div節點 |
node() |
匹配任何類型的節點 |
xpath(//div[@class=’tb_cls’]).node() |
選擇標籤爲div且類屬性爲tb_cls的所有標籤 |
四.多路徑選擇
通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。
用法 |
說明 |
xpath(//book/title |//book/price) |
選取 book 元素的所有 title 和 price 元素。 |
xpath(//title| //price) |
選取文檔中的所有 title 和 price 元素 |
五.XPath 軸
軸可定義相對於當前節點的節點集。
表達式 |
描述 |
用法 |
說明 |
ancestor |
選取當前節點的所有先輩(父、祖父等) |
xpath(//div[@id=’123’]/ancestor::*) |
選擇標籤爲div且ID號爲123的所有先輩標籤 |
ancestor-or-self |
選取當前節點的所有先輩(父、祖父等)以及當前節點本身 |
xpath(//div[@id=’123’]/ancestor-or-self::*) |
選擇標籤爲div且ID號爲123的所有先輩標籤且包含自己 |
attribute |
選取當前節點的所有屬性 |
xpath(//div[@id=’123’]/attribute::class) |
選擇標籤爲div且ID號爲123的類屬性名稱 |
child |
選取當前節點的所有子元素 |
xpath(//div[@id=’123’]/child::book) |
選擇標籤爲div且ID號爲123的所有子元素的爲book 節點 |
descendant |
選取當前節點的所有後代元素(子、孫等) |
xpath(./descendant::*) |
返回當前節點的所有後代節點(子節點、孫節點) |
following |
選取文檔中當前節點結束標籤後的所有節點 |
xpath(./following::*) |
選取文檔中當前節點結束標籤後的所有節點 |
parent |
選取當前節點的父節點 |
xpath(./parent::*) |
選取當前節點的父節點 |
preceding |
選取文檔中當前節點的開始標籤之前的所有節點 |
xpath(//div[@id=’123’]/preceding::*) |
選擇標籤爲div且ID號爲123的開始標籤之前的所有節點 |
preceding-sibling |
選取當前節點之前的所有同級節點 |
xpath(//div[@id=’123’]/preceding-sibling::*) |
選擇標籤爲div且ID號爲123的之前的所有同級節點 |
self |
選取當前節點 |
xpath(./self::*) |
選取當前節點 |
六.XPath 運算符
表達式 |
描述 |
用法 |
說明 |
+ |
加法 |
6 + 4 |
10 |
- |
減法 |
6 - 4 |
2 |
* |
乘法 |
6 * 4 |
24 |
div |
除法 |
8 div 4 |
2 |
= |
等於 |
price=9.80 |
如果 price 是 9.80,則返回 true。 如果 price 是 9.90,則返回 false。 |
!= |
不等於 |
price!=9.80 |
如果 price 是 9.90,則返回 true。 如果 price 是 9.80,則返回 false。 |
< |
小於 |
price<9.80 |
如果 price 是 9.00,則返回 true。 如果 price 是 9.90,則返回 false。 |
<= |
小於或等於 |
price<=9.80 |
如果 price 是 9.00,則返回 true。 如果 price 是 9.90,則返回 false。 |
> |
大於 |
price>9.80 |
如果 price 是 9.90,則返回 true。 如果 price 是 9.80,則返回 false。 |
>= |
大於或等於 |
price>=9.80 |
如果 price 是 9.90,則返回 true。 如果 price 是 9.70,則返回 false。 |
or |
或 |
price=9.80 or price=9.70 |
如果 price 是 9.80,則返回 true。 如果 price 是 9.50,則返回 false。 |
and |
與 |
price>9.00 and price<9.90 |
如果 price 是 9.80,則返回 true。 如果 price 是 8.50,則返回 false。 |
mod |
計算除法的餘數 |
5 mod 2 |
1 |
七.常用的功能函數
使用功能函數能夠更好的進行模糊搜索
表達式 |
描述 |
用法 |
說明 |
starts-with |
選取id值以ma開頭的div節點 |
xpath(‘//div[starts-with(@id,”ma”)]‘) |
選取id值以ma開頭的div節點 |
contains |
選取id值包含ma的div節點 |
xpath(‘//div[contains(@id,”ma”)]‘) |
選取id值包含ma的div節點 |
and |
選取id值包含ma和in的div節點 |
xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) |
選取id值包含ma和in的div節點 |
text() |
選取節點文本包含ma的div節點 |
xpath(‘//div[contains(text(),”ma”)]‘) |
選取節點文本包含ma的div節點 |
總結
本文章向您介紹了爲什麼要學習Xpath、Xpath簡介以及Xpath的基礎語法;接下來您可以嘗試通過編寫代碼來熟悉使用xpath表達式;同時我將會在下一章節(公衆號:DT數據技術博文)爲大家介紹,如何通過Xpath表達式來解析我們的爬蟲數據。
(ID:DT數據技術博文)