[英]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的問題,但沒有幫助。
感謝您的幫助。
更新:
感謝您的回答,但沒有一個對我有用。
我也提到了這兩個字符串
在我的代碼中,我將通過foreach循環對其進行迭代。 因此,我不能保證我將獲得9000作為第二個要素。
我已經嘗試使用Firefox的FirePath擴展程序來提及所有答案,但是在網頁上什么都沒有選擇。
如前所述,我在比賽文本前加了空格。
HTML :(與xpath匹配)
<html>
<body>
<table>
<tbody>
<tr><td><b><a class="s7intext" href="#"> match text</a></b></td></tr>
<tr><td><b><a class="s7intext" href="#"> match text random</a></b></td></tr>
</tbody>
</table>
</body>
</html>
這是我頁面中的HTML,其中包含
字符。 有兩個
字符和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.