2009-08-14 262 views
32

我對XPath相當陌生,現在已經擺弄了幾個小時,所以我不完全確定你是否可以用它來做下面的事情。XPath - 選擇其他元素之後的第一個元素

好的,這是場景:我想從頁面中找到一個鏈接。該鏈接只能通過它的文本值來識別,即。 <a>的文本標籤(< a href =「#」>此鏈接<a>)。到目前爲止,我已經設法讓我的手與文本鏈接元素,唯一的問題是,有一些躺在周圍。

這些鏈接是從由另一個鏈接標籤之前無序列表,這將成爲一個真正的好「錨」點開始的,我想找到(即最後再用元素搜索中找到我可以接受,相匹配的第一個)

爲了澄清事情有點,這裏發生了什麼事情的例子:

<a href="#">first dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

<-- *And i would actually want to find the thing from this list* --> 
<a href="#">second dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

我可能應該指定,我只想與r獲得一個結果或一組結果,第一個元素是「正確」元素 - 我想找到的元素。

編輯: 的問題已經被回答,但也有一些意見,我應該指定該多一點,這樣人們就可以真正瞭解的問題;)

這樣的想法是使用一個元素,用於指定另一個元素的位置,該元素可能會在文檔周圍散佈重複的搜索結果。

本質上,如果您想從一組下拉菜單中找到具有相同名稱或值的元素的給定鏈接,就會遇到類似這樣的情況。

基本上就是這樣。我知道要說明這一點仍然有點困難,但不幸的是我很難更好地解釋它。我相信別人可以做得更好,如果發生這種情況,我很樂意在這裏介紹這些描述。

+0

請更新的問題 - 從迴應,你可以看到你的目標是不明確 – Gishu 2009-08-14 09:17:09

回答

51

我不得不仔細閱讀你的問題幾次,但我想我明白了。你感興趣的是謂詞。謂詞允許您根據條件選擇節點。

例如,你可以這樣做:

//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find'] 

這將選擇具有某些文本任何錨,找到下一個UL,然後通過它的兒童進行。

此外,您還可以指定一個結果集內的位置索引,下面的XPath是一個演示(但不會解決你的問題):

//a[text()='first dropdown menu']/ul/li[last()]/a/text() 

或者你可以使用跨軸兄妹導航/祖先/子女:

//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text() 

所以我不確定我是否理解你的問題,但這應該可以幫助你編寫XPath。

基本上,我假設你的XPath匹配多個列表中的錨,並且你想確保你選擇了正確的錨。在你的XPath的某個時候,你需要一個謂詞來指定一個條件,只有你想要的節點所在的列表纔是真的。

+0

精美的作品。感謝ChrisCM! – JHollanti 2009-08-14 09:25:12

4

只是讓我理解正確的話:你想要的「第二個下拉菜單中的」

ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find'] 

這應該做的伎倆後,「一些鏈接」節點(我不是100%肯定,你會需要檢查位置()= 1,但我認爲如果你省略它,它將匹配所有下面的ul,因爲前面的節點是「全部」 - 這取決於xml結構的其餘部分)

+0

其實我想找到「我想找到鏈接」值與鏈接,但是這將做到這以及;)我會稍微檢查一下。 – JHollanti 2009-08-14 09:05:15

+0

只是修復該部分:) – Niko 2009-08-14 09:05:39

+0

我剛剛讀了一點,你需要位置()= last()而不是position()= 1,因爲前面的所有節點在文檔順序中的上下文節點之前' – Niko 2009-08-14 09:12:34

0

糾正我,如果我錯了 - 你需要選擇「第二下拉菜單」上面的例子,但文本可以複製,所以你只需要第二個。 的XPath:

//a[text()='second drop down menu'][2] 
+0

是的,但想法是通過兩個單獨的「參數」來查找元素。第一個參數是「索引」標籤,第二個參數是我想要查找的特定元素。所以通過靜態位置引用是不可行的。 – JHollanti 2009-08-14 09:16:46

+0

這將返回:second drop down menu或者如果只有一個與其匹配的錨 – 2009-08-14 09:20:41