簡體   English   中英

使用XPath完全匹配字符串

[英]Exact match for string using XPath

我編寫了一個xpath,以使用Selenium C#從網頁中抓取元素。

這是XPath

tbody/tr[@backcolor]/td/b/a[contains(text(),"match text")]

直到我發現重復的match text為止, match text 因此,在網頁上,我有兩個具有match text元素

一個帶有match text ,另一個帶有match text 9000

現在,我只需要單擊以單擊match text 因此,我編寫了以下XPath

table/tbody/tr[@bgcolor]/td/b/a[text()="   match text"]

請注意,匹配文本在網頁上具有前導空格。 上面的Xpath無效。 我已經使用Firefox的Fire Path擴展程序進行了檢查。

誰能建議我一個Xpath,它會找到match text的完全匹配項。 假定匹配文本可以包含任意數量的前導空格。

我也嘗試過使用normalize-space()但這也不起作用。 這就是我嘗試過的

text()[normalize-space(.)='match']

我發現了一些關於SO的問題,但沒有幫助。

感謝您的幫助。

更新:

感謝您的回答,但沒有一個對我有用。

我也提到了這兩個字符串

  • 匹配文字
  • 匹配文字9000

在我的代碼中,我將通過foreach循環對其進行迭代。 因此,我不能保證我將獲得9000作為第二個要素。

我已經嘗試使用Firefox的FirePath擴展程序來提及所有答案,但是在網頁上什么都沒有選擇。

如前所述,我在比賽文本前加了空格。

HTML :(與xpath匹配)

<html>
<body>
<table>
<tbody>
<tr><td><b><a class="s7intext" href="#">&nbsp;&nbsp; match text</a></b></td></tr>
<tr><td><b><a class="s7intext" href="#">&nbsp;&nbsp; match text random</a></b></td></tr>
</tbody>
</table>
</body>
</html>

這是我頁面中的HTML,其中包含&nbsp; 字符。 有兩個&nbsp; 字符和match text前的空格。 我要抓取元素的站點是一個客戶端站點。 我不能說他修改它的HTML。

給定使用contains() XPath可以工作,這兩個選項之一應該可以工作:

tbody/tr[@backcolor]/td/b/a[normalize-space(text()) = 'match text']

tbody/tr[@backcolor]/td/b/a[text()[normalize-space(.) = 'match text']]

輸入HTML進行測試:

<div>
    <a>
       match text 900</a>
    <a>
       match text</a>
</div>

測試的XPath表達式:

//a[normalize-space(text()) = 'match text']

//a[text()[normalize-space(.) = 'match text']]

輸出始終僅是第二個<a>元素(我在這里進行了測試,您可以使用選擇的任何其他測試器)。 如果這些都不起作用,請提供一個簡化的HTML標記,使XPath無法使用。

更新:

根據更新中發布的HTML代碼段,很清楚為什么normalize-space()無法正常工作。 那我建議一種不同的方法。 在XPath 2.0中,您可以使用ends-with()函數來匹配<a>其內部文本以'match text'結尾,如下所示:

//a[ends-with(.,'match text')]

如果Selenium不支持XPath 2.0,則可以在XPath 1.0中模擬ends-with() ,如下所示:

//a[substring(., string-length(.)-string-length('match text')+1) = 'match text']

對所有答案進行評論:最好避免使用text() ,因為這會使它對評論節點敏感。 另外,某些(不正確的)XPath實現無法加入相鄰的文本節點,這些文本節點可以存在於以編程方式構造的DOM中。 因此,始終最好匹配元素的字符串值,而不是文本節點。 而且無論如何,它都更簡單。 這是正確的解決方案:

tbody/tr[@backcolor]/td/b/a[normalize-space(.) = 'match text']

您的第一次嘗試已經結束。

如果只有9000個匹配項是不想要的匹配項,請嘗試使用“不”排除9000個匹配項:

tbody/tr[@backcolor]/td/b/a[contains(text(), 'match text') and not (contains(text(), '9000'))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM