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

98

这个SO问题的帮助下,我有了一个几乎可以工作的xpath:

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

但是这会得到两个 divs: 其中一个的子元素 td 有 someText,另一个的子元素是 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>

1
你需要至少发布输入的XML的一部分,以便确定你想要为其编写XPath表达式的内容。 - SomeDude
你是指 ...and contains(span, 'someText')] 吗? - Sami Kuhmonen
这正是我所想的,但是在FirePath验证器中却出现了“没有匹配节点”的提示。 - Andrejs
@SamiKuhmonen - 差不多了。应该是 and contains(div/span, 'someText')] - Daniel Haley
1
是的,根据示例,应该使用div/span。 - Sami Kuhmonen
5个回答

149

要找到一个包含特定文本的{span}在任何深度的某个类别{div},请尝试以下代码:

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

这种解决方案看起来非常脆弱。如果表格中恰好包含一个带有您要查找的文本的元素,那么包含表格的
元素也将被匹配。我建议找到一种更健壮的过滤元素的方法。例如,使用ID或顶级文档结构。

13
屏幕抓取本质上总是非常脆弱的。 - Michael Kay
有没有办法选择一个子元素的类包含特定文本的元素? - oldboy

26

你可以使用ancestor。我觉得这样更易读,因为你实际上要选择的元素在路径的末尾。

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

更多关于“轴”(其中祖先是其中之一)的信息:https://www.w3schools.com/xml/xpath_axes.asp - AnorZaken

20

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

2
那会选择<span>而不是<div>。 - Daniel Haley
我认为 OP 想要 span - SomeDude
1
我尝试用 <-- 注释使其尽可能明确 :) - Andrejs

3
您可以将第二个条件更改为仅检查span元素:
...and contains(div/span, 'someText')]

如果span不总是在另一个div中,您也可以使用:
...and contains(.//span, 'someText')]

这个搜索在div中任何地方查找span。

接受nwellnhof的答案,因为他最先回答了,但是+1给提供替代方案的人。谢谢。 - Andrejs

0
你可以简单地这样做:
//div[contains(text(),'someText')][@class='measure-tab']

这个 XPath 表达式将选择 DOM 中所有包含文本“someText”且具有值为“measure-tab”的 class 属性的 div 元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接