xpath如何取包含多個class屬性
如果html結(jié)構(gòu)是這樣
<div class="demo"></div>
那么我知道可以寫xpath //div[@class="demo"],但是如果我的html是
<div class="test demo"></div>
<div class="demo test"></div>
<div class="test demo2"></div>
我只想選出有demo這個class的對象,那應(yīng)該怎么弄
要取多個class屬性值的元素,應(yīng)該如何辦呢;
如:
<div class='a b'>test</div>
如果是用xpath('//div[@class="a"]') 會取不到這里面的值;
可以用如下的表達式:
xpath('//div[contains(@class,"a")]') #它會取得所有class為a的元素
或者
xpath('//div[contains(@class,"a") and contains(@class,"b")]') #它會取class同時有a和b的元素
如果沒記錯的話可以這么來:
//div[contains(@class, 'demo')]
如果是多個則可以:
//div[contains(@class, 'demo') and contains(@class, 'other')]
如果目標 class 不一定是第一個,那么:
//div[contains(concat(' ', @class, ' '), 'demo')]
順便一提,用 Jetbrains 家的 IDE,里面有內(nèi)置的 xpath 規(guī)則生成器。
一、選取節(jié)點
常用的路勁表達式:
表達式 | 描述 | 實例 | |
nodename | 選取nodename節(jié)點的所有子節(jié)點 | xpath('//div’) | 選取了div節(jié)點的所有子節(jié)點 |
/ | 從根節(jié)點選取 | xpath('/div’) | 從根節(jié)點上選取div節(jié)點 |
// | 選取所有的當(dāng)前節(jié)點,不考慮他們的位置 | xpath('//div’) | 選取所有的div節(jié)點 |
. | 選取當(dāng)前節(jié)點 | xpath('./div’) | 選取當(dāng)前節(jié)點下的div節(jié)點 |
.. | 選取當(dāng)前節(jié)點的父節(jié)點 | xpath('..’) | 回到上一個節(jié)點 |
@ | 選取屬性 | xpath(’//@calss’) | 選取所有的class屬性 |
二、謂語
謂語被嵌在方括號內(nèi),用來查找某個特定的節(jié)點或包含某個制定的值的節(jié)點
實例:
表達式 | 結(jié)果 |
xpath('/body/div[1]’) | 選取body下的第一個div節(jié)點 |
xpath('/body/div[last()]’) | 選取body下最后一個div節(jié)點 |
xpath('/body/div[last()-1]’) | 選取body下倒數(shù)第二個div節(jié)點 |
xpath('/body/div[positon()<3]’) | 選取body下前兩個div節(jié)點 |
xpath('/body/div[@class]’) | 選取body下帶有class屬性的div節(jié)點 |
xpath('/body/div[@class="main"]’) | 選取body下class屬性為main的div節(jié)點 |
xpath('/body/div[price>35.00]’) | 選取body下price元素值大于35的div節(jié)點 |
三、通配符
Xpath通過通配符來選取未知的XML元素
表達式 | 結(jié)果 |
xpath(’/div/*’) | 選取div下的所有子節(jié)點 |
xpath('/div[@*]’) | 選取所有帶屬性的div節(jié)點 |
四、取多個路徑
使用"|"運算符可以選取多個路徑
>
表達式 | 結(jié)果 |
xpath('//div|//table’) | 選取所有的div和table節(jié)點 |
五、Xpath軸
軸可以定義相對于當(dāng)前節(jié)點的節(jié)點集
軸名稱 | 表達式 | 描述 |
ancestor | xpath('./ancestor::*’) | 選取當(dāng)前節(jié)點的所有先輩節(jié)點(父、祖父) |
ancestor-or-self | xpath('./ancestor-or-self::*’) | 選取當(dāng)前節(jié)點的所有先輩節(jié)點以及節(jié)點本身 |
attribute | xpath('./attribute::*’) | 選取當(dāng)前節(jié)點的所有屬性 |
child | xpath('./child::*’) | 返回當(dāng)前節(jié)點的所有子節(jié)點 |
descendant | xpath('./descendant::*’) | 返回當(dāng)前節(jié)點的所有后代節(jié)點(子節(jié)點、孫節(jié)點) |
following | xpath('./following::*’) | 選取文檔中當(dāng)前節(jié)點結(jié)束標簽后的所有節(jié)點 |
following-sibing | xpath('./following-sibing::*’) | 選取當(dāng)前節(jié)點之后的兄弟節(jié)點 |
parent | xpath('./parent::*’) | 選取當(dāng)前節(jié)點的父節(jié)點 |
preceding | xpath('./preceding::*’) | 選取文檔中當(dāng)前節(jié)點開始標簽前的所有節(jié)點 |
preceding-sibling | xpath('./preceding-sibling::*’) | 選取當(dāng)前節(jié)點之前的兄弟節(jié)點 |
self | xpath('./self::*’) | 選取當(dāng)前節(jié)點 |
六、功能函數(shù)
使用功能函數(shù)能夠更好的進行模糊搜索
函數(shù) | 用法 | 解釋 |
starts-with | xpath('//div[starts-with(@id,"ma")]') | 選取id值以ma開頭的div節(jié)點 |
contains | xpath('//div[contains(@id,"ma")]') | 選取id值包含ma的div節(jié)點 |
and | xpath('//div[contains(@id,"ma") and contains(@id,"in")]') | 選取id值包含ma和in的div節(jié)點 |
text() | xpath('//div[contains(text(),"ma")]') | 選取節(jié)點文本包含ma的div節(jié)點 |
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答!! 點擊進入論壇