ChatGPT解决这个技术问题 Extra ChatGPT

Xpath:选择包含类且其特定子元素包含文本的 div

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>
你需要发布输入 xml 至少一部分你想写的 xpath 吗?
你是说...and contains(span, 'someText')]吗?
这就是我的想法,但后来我在 FirePath 验证器中得到“没有匹配的节点”
@SamiKuhmonen - 关闭。它将是 ` 和 contains(div/span, 'someText')]`
是的,看到这个例子,它将是 div/span

C
Community

要查找包含包含特定文本的 span at any depth 的特定类的 div,请尝试:

//div[contains(@class, 'measure-tab') and contains(.//span, 'someText')]

也就是说,这个解决方案看起来非常脆弱。如果表格恰好包含带有您要查找的文本的 span,则包含该表格的 div 也将被匹配。我建议找到一种更强大的过滤元素的方法。例如,通过使用 ID 或顶级文档结构。


从本质上讲,屏幕抓取总是非常脆弱。
有什么方法可以选择子类包含特定文本的元素?
D
DowntownDev

您可以使用 ancestor。我发现这更容易阅读,因为您实际选择的元素位于路径的末尾。

//span[contains(text(),'someText')]/ancestor::div[contains(@class, 'measure-tab')]

有关“轴”(祖先是其中之一)的更多信息:w3schools.com/xml/xpath_axes.asp
S
SomeDude

您可以使用 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>'

那将选择跨度而不是div。
我以为 OP 想要span
我试图用 <-- 评论使其尽可能明确:)
S
Sami Kuhmonen

您可以更改第二个条件以仅检查 span 元素:

...and contains(div/span, 'someText')]

如果跨度并不总是在另一个 div 内,您也可以使用

...and contains(.//span, 'someText')]

这将搜索 div 内任何位置的跨度。


接受 nwellnhof 的回答,因为他首先得到它,但 +1 替代。干杯。