XPath筛选不含strong子/孙节点的p标签失败,求纠错方法
错误原因分析
- 逻辑运算符误用:你用了
or,但实际需要同时排除“有子节点strong”和“有孙节点strong”的p标签,or会导致只要满足其中一个条件就选中,反而会把不符合要求的p标签(比如有孙节点strong但无子节点strong的)也纳入结果。 - XPath语法错误:
child::a > strong是错误写法,定位a标签下的strong节点应该用child::a/strong;而且这种写法只考虑了a标签下的strong,无法覆盖其他子节点(比如span、div)下的strong,局限性太强。 - 范围覆盖不全:原XPath只检查了直接子节点的strong,没覆盖所有后代节点(孙节点及更深层级)。
修正方法
直接使用descendant轴匹配所有后代节点,一步到位筛选出没有任何层级strong后代的p标签,XPath写法:
//p[not(descendant::strong)]
写法解释
descendant::strong:匹配当前p标签下所有层级的strong节点(包括子节点、孙节点、曾孙节点等所有后代)not(...):取反逻辑,当p标签下不存在任何strong后代节点时,该p标签会被选中
用这个XPath匹配你提供的示例代码,只会选中第1、4个符合要求的p标签,完全排除第2、3、5个不符合的标签,满足需求。
内容的提问来源于stack exchange,提问作者CodeMonkey
相关产品推荐
相关产品推荐

