首页 > 解决方案 > 带有特定后代标签的标签的 XPath 选择器选择其他标签

问题描述

给定一个文件:

<html>
  <body>
    <div>
      <div>No span</div>
      <span>Target</span>
    </div>
  </body>
</html>

我想选择<div>包含<span>. 但是,当我使用此选择器时:

//div[//span]

它匹配两个<div>s:

<div><div>No span</div><span>Target</span></div>   <-- what I wanted
<div>No span</div>                                 <-- this is also matched

我在 Google Chrome 的 Devtools 以及几个在线 XPath 评估器上对此进行了测试,所以我认为这是正确的行为。

为什么会发生这种情况,我该如何修复我的选择器?

标签: xpath

解决方案


选择<div>包含<span>

使用相对路径。

//div[.//span]

//从文档根目录开始。.//从上下文元素开始。

当包含的表达式选择节点时,谓词评估为真。这意味着当文档中//div[//span]<span>任何位置时总是如此,在这种情况下<div>,将选择文档中的所有 s。//div[.//span]仅当<span>相应的<div>.

如果您的意思是“有一个<span>孩子”(而不是“有一个<span>后代”),这将起作用:

//div[span]

/这是对此的简写(强调和之间的区别//):

//div[./span]

推荐阅读