1. 程式人生 > >Xpath語法-爬蟲(一)

Xpath語法-爬蟲(一)

方括號 true 用法 descend 節點和 數據解析 講解 擁有 數據轉換

前言
這一章節主要講解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 元素。 
//title[@lang]選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang=‘eng‘] 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
/bookstore/book[position()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<= 小於或等於 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 如果 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語法-爬蟲(一)