如何用XPath提取classA标签内classC之前的所有文本?
解决方案
核心XPath表达式
//span[@class="classA"]//text()[not(ancestor::span[@class="classC"]) and count(preceding::span[@class="classC"][ancestor::span[@class="classA"]]) = 0]
表达式解释
//span[@class="classA"]//text():定位classA类span下的所有文本节点(包括子节点内的文本)not(ancestor::span[@class="classC"]):排除所有属于classC类span内部的文本count(preceding::span[@class="classC"][ancestor::span[@class="classA"]]) = 0:只保留第一个classC类span之前的文本,自动过滤掉classC之后的所有内容;如果没有classC类span,该条件始终成立,返回所有符合前两个条件的文本
测试验证
针对给出的所有场景,这个表达式都能得到预期结果:
- 示例1:返回
"Text 1 Text 2 Text 3" - 含classC的变体:均返回
"Text 1" - 无classC的示例:返回
"Text 1 Text 2 Text3"
为什么之前的表达式不行?
- 第一次尝试的
//span[@class="classA"]//text()[parent::*[not(@class="classC")]]:只排除了classC直接子节点的文本,但没过滤classC之后的文本,所以会返回Text5这类内容 - 第二次尝试的
//span[@class="classC"]//parent::*/preceding::text():依赖classC节点的存在,一旦没有classC就返回空结果,无法覆盖所有场景
内容的提问来源于stack exchange,提问作者Rico Sonntag
相关产品推荐
相关产品推荐

