您好,登錄后才能下訂單哦!
Xpath簡(jiǎn)介
XPath即為XML路徑語(yǔ)言,它是一種用來(lái)確定XML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集)文檔中某部分位置的語(yǔ)言。XPath基于XML的樹(shù)狀結(jié)構(gòu),有不同類型的節(jié)點(diǎn),包括元素節(jié)點(diǎn),屬性節(jié)點(diǎn)和文本節(jié)點(diǎn),提供在數(shù)據(jù)結(jié)構(gòu)樹(shù)中找尋節(jié)點(diǎn)的能力。起初 XPath 的提出的初衷是將其作為一個(gè)通用的、介于XPointer與XSLT間的語(yǔ)法模型。但是 XPath 很快的被開(kāi)發(fā)者采用來(lái)當(dāng)作小型查詢語(yǔ)言。
簡(jiǎn)單來(lái)說(shuō)我們通過(guò)Xpath可以獲取XML中的指定元素和指定節(jié)點(diǎn)的值。在網(wǎng)絡(luò)爬蟲(chóng)中我們通過(guò)會(huì)把爬蟲(chóng)獲取的HTML數(shù)據(jù)轉(zhuǎn)換成XML結(jié)構(gòu),然后通過(guò)XPath解析,獲取我們想要的結(jié)果。
接下來(lái)為大家分享以下xpath的表達(dá)式以及用法。
一.選取節(jié)點(diǎn)
Xpath使用路徑表達(dá)式在XML文檔中選取節(jié)點(diǎn)。節(jié)點(diǎn)是通過(guò)沿著路徑來(lái)選取的,通過(guò)路徑可以找到我們想要的節(jié)點(diǎn)或者節(jié)點(diǎn)范圍。
表達(dá)式 | 描述 | 用法 | 說(shuō)明 |
nodename | 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)。 | xpath(‘span’) | 選取span元素的所有子節(jié)點(diǎn) |
/ | 從根節(jié)點(diǎn)選取 | xpath(‘/div’) | 從根節(jié)點(diǎn)上選取div節(jié)點(diǎn) |
// | 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置。 | xpath(‘//div’) | 從當(dāng)前節(jié)點(diǎn)選取含有div節(jié)點(diǎn)的標(biāo)簽 |
. | 選取當(dāng)前節(jié)點(diǎn) | xpath(‘./div’) | 選取當(dāng)前節(jié)點(diǎn)下的div標(biāo)簽 |
.. | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) | xpath(‘../’) | 回到上一級(jí)節(jié)點(diǎn) |
@ | 選取屬性 | xpath(“//div[@id=’1001’]”) | 獲取div標(biāo)簽中,含有ID屬性且值為1001的標(biāo)簽 |
二.謂語(yǔ)(Predicates)
謂語(yǔ)用來(lái)查找某個(gè)特定的節(jié)點(diǎn)或者包含某個(gè)指定的值的節(jié)點(diǎn)。
謂語(yǔ)被嵌在方括號(hào)中。
表達(dá)式描述述 | 用法說(shuō)明 |
/bookstore/book[1] | 選取屬于 bookstore 子元素的第一個(gè) book 元素。 |
/bookstore/book[last()] | 選取屬于 bookstore 子元素的最后一個(gè) book 元素。 |
/bookstore/book[last()-1] | 選取屬于 bookstore 子元素的倒數(shù)第二個(gè) book 元素。 |
/bookstore/book[position()<3] | 選取最前面的兩個(gè)屬于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素。 |
//title[@lang='eng'] | 選取所有 title 元素,且這些元素?fù)碛兄禐?/span> 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 通配符可用來(lái)選取未知的 XML 元素,通配指定節(jié)點(diǎn)。
表達(dá)式 | 描述 | 用法 | 說(shuō)明 |
* | 匹配任何元素節(jié)點(diǎn) | xpath(/div/*) | 選取div下的所有子節(jié)點(diǎn) |
@* | 匹配任何屬性節(jié)點(diǎn) | xpath(/div[@*]) | 選取所有帶屬性的div節(jié)點(diǎn) |
node() | 匹配任何類型的節(jié)點(diǎn) | xpath(//div[@class=’tb_cls’]).node() | 選擇標(biāo)簽為div且類屬性為tb_cls的所有標(biāo)簽 |
四.多路徑選擇
通過(guò)在路徑表達(dá)式中使用“|”運(yùn)算符,您可以選取若干個(gè)路徑。
用法 | 說(shuō)明 |
xpath(//book/title |//book/price) | 選取 book 元素的所有 title 和 price 元素。 |
xpath(//title| //price) | 選取文檔中的所有 title 和 price 元素 |
五.XPath 軸
軸可定義相對(duì)于當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)集。
表達(dá)式 | 描述 | 用法 | 說(shuō)明 |
ancestor | 選取當(dāng)前節(jié)點(diǎn)的所有先輩(父、祖父等) | xpath(//div[@id=’123’]/ancestor::*) | 選擇標(biāo)簽為div且ID號(hào)為123的所有先輩標(biāo)簽 |
ancestor-or-self | 選取當(dāng)前節(jié)點(diǎn)的所有先輩(父、祖父等)以及當(dāng)前節(jié)點(diǎn)本身 | xpath(//div[@id=’123’]/ancestor-or-self::*) | 選擇標(biāo)簽為div且ID號(hào)為123的所有先輩標(biāo)簽且包含自己 |
attribute | 選取當(dāng)前節(jié)點(diǎn)的所有屬性 | xpath(//div[@id=’123’]/attribute::class) | 選擇標(biāo)簽為div且ID號(hào)為123的類屬性名稱 |
child | 選取當(dāng)前節(jié)點(diǎn)的所有子元素 | xpath(//div[@id=’123’]/child::book) | 選擇標(biāo)簽為div且ID號(hào)為123的所有子元素的為book 節(jié)點(diǎn) |
descendant | 選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子、孫等) | xpath(./descendant::*) | 返回當(dāng)前節(jié)點(diǎn)的所有后代節(jié)點(diǎn)(子節(jié)點(diǎn)、孫節(jié)點(diǎn)) |
following | 選取文檔中當(dāng)前節(jié)點(diǎn)結(jié)束標(biāo)簽后的所有節(jié)點(diǎn) | xpath(./following::*) | 選取文檔中當(dāng)前節(jié)點(diǎn)結(jié)束標(biāo)簽后的所有節(jié)點(diǎn) |
parent | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) | xpath(./parent::*) | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) |
preceding | 選取文檔中當(dāng)前節(jié)點(diǎn)的開(kāi)始標(biāo)簽之前的所有節(jié)點(diǎn) | xpath(//div[@id=’123’]/preceding::*) | 選擇標(biāo)簽為div且ID號(hào)為123的開(kāi)始標(biāo)簽之前的所有節(jié)點(diǎn) |
preceding-sibling | 選取當(dāng)前節(jié)點(diǎn)之前的所有同級(jí)節(jié)點(diǎn) | xpath(//div[@id=’123’]/preceding-sibling::*) | 選擇標(biāo)簽為div且ID號(hào)為123的之前的所有同級(jí)節(jié)點(diǎn) |
self | 選取當(dāng)前節(jié)點(diǎn) | xpath(./self::*) | 選取當(dāng)前節(jié)點(diǎn) |
六.XPath 運(yùn)算符
表達(dá)式 | 描述 | 用法 | 說(shuō)明 |
+ | 加法 | 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。 |
<3 | 小于 | 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 | 計(jì)算除法的余數(shù) | 5 mod 2 | 1 |
七.常用的功能函數(shù)
使用功能函數(shù)能夠更好的進(jìn)行模糊搜索
表達(dá)式 | 描述 | 用法 | 說(shuō)明 |
starts-with | 選取id值以ma開(kāi)頭的div節(jié)點(diǎn) | xpath(‘//div[starts-with(@id,”ma”)]‘) | 選取id值以ma開(kāi)頭的div節(jié)點(diǎn) |
contains | 選取id值包含ma的div節(jié)點(diǎn) | xpath(‘//div[contains(@id,”ma”)]‘) | 選取id值包含ma的div節(jié)點(diǎn) |
and | 選取id值包含ma和in的div節(jié)點(diǎn) | xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) | 選取id值包含ma和in的div節(jié)點(diǎn) |
text() | 選取節(jié)點(diǎn)文本包含ma的div節(jié)點(diǎn) | xpath(‘//div[contains(text(),”ma”)]‘) | 選取節(jié)點(diǎn)文本包含ma的div節(jié)點(diǎn) |
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。