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

时间:2016-08-14 13:46:18

标签: xpath

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>

4 个答案:

答案 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内任何位置的范围。