xpath - 带有特定后代标签的标签的 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 评估器上对此进行了测试,所以我认为这是正确的行为。
为什么会发生这种情况,我该如何修复我的选择器?
解决方案
选择
<div>
包含<span>
使用相对路径。
//div[.//span]
//
从文档根目录开始。.//
从上下文元素开始。
当包含的表达式选择节点时,谓词评估为真。这意味着当文档中//div[//span]
有<span>
任何位置时总是如此,在这种情况下<div>
,将选择文档中的所有 s。//div[.//span]
仅当<span>
相应的<div>
.
如果您的意思是“有一个<span>
孩子”(而不是“有一个<span>
后代”),这将起作用:
//div[span]
/
这是对此的简写(强调和之间的区别//
):
//div[./span]
推荐阅读
- javascript - Thingsboard 小部件库 Javascript 不起作用
- html - Tailwind Css:仅为容器设置滚动
- multithreading - 数学 - 计算处理请求所需的时间
- javascript - TypeError:无法读取未定义的属性“导航”-React Native
- python - Python 生成器如何节省内存和时间?
- docker - 如何使 docker 容器充当另一个容器的中继?
- java - 在 excel 中写入数据时发生错误。无法读取 zip 条目
- regex - 正则表达式使用 RE2 在空格之前匹配字符串之后
- javascript - 为什么在我的异步函数的不同位置使用 await 会产生不同的结果?
- cypress - 赛普拉斯打开所有模拟窗口的参数