如何修改XPath以获取div下hr前p标签内包含a标签的所有文本?
问题原因
你之前的XPath会漏掉嵌套标签文本,核心原因是结尾的/text()只会提取当前节点的直接子文本节点,p标签内嵌套的a标签属于p的子元素,a包裹的文本不属于p的直接文本节点,因此不会被匹配到。
调整方案
如果你的需求是提取第一个hr之前所有p标签的完整文本(包含内部嵌套标签的文本),可以根据使用场景选择下面两种写法:
直接获取每个p标签拼接完成的完整文本
XPath表达式://div[@class="entry"]/p[not(preceding-sibling::hr)]/string(.)
这种写法会自动把每个p标签内部所有层级的文本按顺序拼接,返回的结果是4个字符串,对应示例里的前4个p的完整内容,不需要额外做拼接处理。提取所有独立的文本节点
XPath表达式://div[@class="entry"]/p[not(preceding-sibling::hr)]//text()
这种写法会把所有零散的文本节点单独返回,比如示例中第四个p会返回some text4、a标签内的文本、some text5三个独立结果,适合需要单独处理每段文本的场景。
补充说明
这里把原表达式里的*替换成了p,可以精准匹配只需要的p标签,避免匹配到div下其他无关的标签内容。如果确实需要匹配p以外的其他标签,把p改回*即可。
内容的提问来源于stack exchange,提问作者rajsx
相关产品推荐
相关产品推荐

