在 this SO question 的帮助下,我有一个几乎可以工作的 xpath:
//div[contains(@class, 'measure-tab') and contains(., 'someText')]
然而,这有两个 divs
:一个是具有 someText 的子 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>
...and contains(span, 'someText')]
吗?
要查找包含包含特定文本的 span
at any depth 的特定类的 div
,请尝试:
//div[contains(@class, 'measure-tab') and contains(.//span, 'someText')]
也就是说,这个解决方案看起来非常脆弱。如果表格恰好包含带有您要查找的文本的 span
,则包含该表格的 div
也将被匹配。我建议找到一种更强大的过滤元素的方法。例如,通过使用 ID 或顶级文档结构。
您可以使用 ancestor
。我发现这更容易阅读,因为您实际选择的元素位于路径的末尾。
//span[contains(text(),'someText')]/ancestor::div[contains(@class, 'measure-tab')]
您可以使用 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>'
span
您可以更改第二个条件以仅检查 span 元素:
...and contains(div/span, 'someText')]
如果跨度并不总是在另一个 div 内,您也可以使用
...and contains(.//span, 'someText')]
这将搜索 div 内任何位置的跨度。
不定期副业成功案例分享