在this SO question的帮助下,我有一个几乎正常工作的xpath:
//div[contains(@class, 'measure-tab') and contains(., 'someText')]
然而,这会得到两个divs
:其中一个是孩子td
有一个文本,另一个是孩子span
。
如何将其缩小到span
?
<div class="measure-tab">
<!-- table html omitted -->
<td> someText</td>
</div>
<div class="measure-tab"> <-- I want to select this div (and use contains @class)
<div>
<span> someText</span> <-- that contains a deeply nested span with this text
</div>
</div>
答案 0 :(得分:27)
要查找包含包含特定文字的div
at any depth的某个班级的span
,请尝试:
//div[contains(@class, 'measure-tab') and contains(.//span, 'someText')]
那就是说,这个解决方案看起来非常脆弱。如果表格恰好包含span
,其中包含您要查找的文字,则包含该表格的div
也会匹配。我建议找一种更有效的过滤元素的方法。例如,通过使用ID或顶级文档结构。
答案 1 :(得分:5)
您可以使用ancestor
。我发现这更容易阅读,因为您实际选择的元素位于路径的末尾。
//span[contains(text(),'someText')]/ancestor::div[contains(@class, 'measure-tab')]
答案 2 :(得分:4)
您可以使用xpath:
//div[@class="measure-tab" and .//span[contains(., "someText")]]
输入:
<root>
<div class="measure-tab">
<td> someText</td>
</div>
<div class="measure-tab">
<div>
<div2>
<span>someText2</span>
</div2>
</div>
</div>
</root>
输出:
Element='<div class="measure-tab">
<div>
<div2>
<span>someText2</span>
</div2>
</div>
</div>'
答案 3 :(得分:3)
您可以更改第二个条件以仅检查span元素:
...and contains(div/span, 'someText')]
如果跨度不总是在另一个div内,您也可以使用
...and contains(.//span, 'someText')]
这将搜索div内任何位置的范围。