目錄
- 什么是Xpath?
- 常見的Xpath中節(jié)點及節(jié)點間的關(guān)系
- Xpath路徑表達(dá)式(節(jié)選)
2018.3.28更新
補(bǔ)充說明了 /
(根節(jié)點的作用)
說明了/
與//
的區(qū)別
什么是Xpath?
Xpath是XML-路徑語言的簡稱路召。顧名思義贮尖,Xpath可以用于定位XML文本的節(jié)點玩徊,但實際上,Xpath也適用于定位HTML中的節(jié)點媳瞪。
節(jié)點及節(jié)點間的關(guān)系
在HTML中,節(jié)點就是一個個HTML標(biāo)簽刻肄。分析節(jié)點間的關(guān)系也就是要清楚HTML文檔中各標(biāo)簽間的關(guān)系阐污。厘清這些關(guān)系對于書寫Xpath路徑表達(dá)式來說非常重要。
節(jié)點間的關(guān)系(下面通過一段HTML代碼說明:)
<div class="header-wrapper">
<a >
<a ><img src="xxx" alt="文章" /></a>
</div>
父節(jié)點(Parent)
元素div是元素a的父節(jié)點突梦;第二個元素a也是元素img的父節(jié)點诫舅。
子節(jié)點(Children)
元素a是元素div的子節(jié)點;元素img是子節(jié)點宫患。
兄弟/同胞節(jié)點(Sibling)
兄弟節(jié)點在HTML中的地位相等刊懈,它們有相同的父節(jié)點。如上面例子中撮奏,兩個a元素互為兄弟節(jié)點俏讹。
先輩節(jié)點(Descendant)
對于img元素來說,它的父節(jié)點(第二個a元素)畜吊,和它的父節(jié)點的父節(jié)點(元素div)統(tǒng)稱為img的先輩節(jié)點泽疆。在一個HTML文件中,先輩節(jié)點一般不唯一玲献,比如這里的例子中殉疼,元素img的先輩節(jié)點包含兩個元素梯浪。
后代節(jié)點(Descendant)
對于img元素來說,它的子節(jié)點(第二個a元素)瓢娜,和它的子節(jié)點的子節(jié)點(元素img)統(tǒng)稱為div的后代節(jié)點挂洛。
在使用Xpath中,搞清楚節(jié)點間的關(guān)系是非常重要的眠砾。
Xpath路徑表達(dá)式(節(jié)選)
XPath 使用路徑表達(dá)式來選取 XML 文檔(或是HTML文檔)中的節(jié)點或節(jié)點集虏劲。下面列舉一些常見的路徑表達(dá)式。
路徑表達(dá)式 | 描述 |
---|---|
/div/p | 選取div下的所有p節(jié)點(p必須是div的子節(jié)點) |
/div//a | 選取div下所有a節(jié)點而不考慮其位置(a標(biāo)簽只要是div的子孫節(jié)點即可) |
@class | 選取名為class的屬性 |
/div/.. | 選取div的父節(jié)點 |
-
/
表示從根節(jié)點開始(html文件中是html節(jié)點)褒颈,而根節(jié)點后不一定是div節(jié)點柒巫,但為了表達(dá)簡潔,省略了div節(jié)點前的部分路徑表達(dá)式谷丸,后面也是堡掏。實際使用時需要注意。
再看稍微復(fù)雜的情況
路徑表達(dá)式 | 描述 |
---|---|
/div/a | 從根節(jié)點開始選取div節(jié)點下的a節(jié)點 |
/div/a[2]/img | 從根節(jié)點開始選取div節(jié)點下的第二個a節(jié)點下的img節(jié)點 |
//div[@class="header-wrapper"] | 選取所有屬性class的值為header-wrapper的div節(jié)點 |
- 在節(jié)點后加上帶有數(shù)字的方括號刨疼,可以根據(jù)兄弟節(jié)點在文檔中出現(xiàn)的先后次序選擇元素(數(shù)字1為第一個依次類推)泉唁。如果說我想取一個元素,而它從倒數(shù)來看更加方便揩慕,那該如何取呢亭畜?后面將說明這種方法。
- 通過在節(jié)點后加上帶有屬性名-值對的方括號迎卤,可以篩選出需要的節(jié)點贱案。屬性值的寫法為:@屬性名=“屬性值”
選取位置元素和屬性
路徑表達(dá)式 | 描述 |
---|---|
//*/di | 選取文檔中所有元素 |
//@* | 選取文檔中所有帶屬性的元素 |
最后介紹Xpath中一些常用的函數(shù)
路徑表達(dá)式 | 描述 |
---|---|
/div/p/text() | 選取p節(jié)點的文本內(nèi)容 |
//div[contains(@class,"post")] | 選取帶有class屬性且值包含“post”的所有div節(jié)點 |
/div/p[last()-1] | 選取div下倒數(shù)第二個p節(jié)點 注:last()后的數(shù)字沒有表示倒數(shù)第一 |
- 適用路徑表達(dá)式時必須將其包圍在一對單引號(或雙引號)中。如果路徑表達(dá)式外是雙引號止吐,則路徑表達(dá)式中的屬性值必須用單引號宝踪;如果路徑表示外是單引號,則路徑表達(dá)式中的屬性值必須用雙引號碍扔,以此來避免歧義瘩燥。
- contains函數(shù)在提取一個帶有多值屬性的節(jié)點時很有幫助
選取多個元素——在路徑表示中使用'|'
路徑表達(dá)式 | 描述 |
---|---|
/div/a | /div/p | 選取div下的a節(jié)點和div下的p節(jié)點 |
更新ing..