请注意:可以找到此问题的更精确版本,并找到合适的答案here。
我想使用Selenium Python绑定来在网页上查找具有给定文本的元素。例如,假设我有以下HTML:
<html>
<head>...</head>
<body>
<someElement>This can be found</someElement>
<someOtherElement>This can <em>not</em> be found</someOtherElement>
</body>
</html>
我需要按文字搜索,并且能够使用以下XPath找到<someElement>
:
//*[contains(text(), 'This can be found')]
我正在寻找类似的XPath,让我可以使用 plain 文本<someOtherElement>
找到"This can not be found"
。以下不起作用:
//*[contains(text(), 'This can not be found')]
我理解这是因为嵌套的em
元素会“破坏”“无法找到这个”的文本流。在某种程度上,是否可以通过XPath忽略上述类似或类似的嵌套?
答案 0 :(得分:18)
您可以使用//*[contains(., 'This can not be found')]
。
在与“无法找到”之前,上下文节点.
将转换为其字符串表示形式。
请小心,因为您使用的是//*
,因此它会匹配包含此字符串的所有 englobing元素。
在您的示例中,它将匹配:
<someOtherElement>
<body>
<html>
!您可以通过定位文档中的特定元素标记或特定部分(具有已知ID或类的<table>
或<div>
)来限制此操作
编辑OP的问题,评论如何找到与文本条件匹配的最嵌套元素:
The accepted answer here建议//*[count(ancestor::*) = max(//*/count(ancestor::*))]
选择嵌套最多的元素。我认为这只是XPath 2.0。
当与子字符串条件结合使用时,我能够使用此文档test it here
<html>
<head>...</head>
<body>
<someElement>This can be found</someElement>
<nested>
<someOtherElement>This can <em>not</em> be found most nested</someOtherElement>
</nested>
<someOtherElement>This can <em>not</em> be found</someOtherElement>
</body>
</html>
并使用此XPath 2.0表达式
//*[contains(., 'This can not be found')]
[count(ancestor::*) = max(//*/count(./*[contains(., 'This can not be found')]/ancestor::*))]
它匹配包含“无法找到最嵌套”的元素。
可能有更优雅的方式来做到这一点。