XPath使用following::*获取数据重复,如何获取ul内非重复文本?
解决XPath抓取嵌套标签文本重复的问题
你的问题出在following::*会匹配目标节点之后的所有元素节点,包括容器节点(如<ul>)和它的所有子节点(<li>、<a>等),每个节点的文本都会被单独返回,自然会出现重复。要获取<ul>内的完整无重复文本,按以下方法处理:
方法1:直接定位目标容器节点并提取文本
放弃遍历所有后续节点,直接定位到你要的<ul>节点,再提取它的完整文本:
- 如果你知道目标
<ul>是某个标签的同级后续节点,用following-sibling轴更精准:
比如前置标签是//前置标签的定位表达式/following-sibling::ul[1]/string()<h3>,内容为"列表标题"://h3[text()='列表标题']/following-sibling::ul[1]/string() - 如果你需要去除多余的换行、空格,用
normalize-space()包裹:normalize-space(//h3[text()='列表标题']/following-sibling::ul[1])
方法2:限制following轴的匹配范围
如果一定要用following轴,必须明确只匹配目标<ul>节点,而非所有后续元素:
//前置标签的定位表达式/following::ul[1]
然后提取该节点的文本,而不是遍历所有following::*的子节点。
原理说明
following::*会选中目标节点之后的所有层级的元素,包括<ul>本身、它的子<li>、<li>里的<a>等,每个节点的text()都会被单独返回,导致同一内容多次出现。而直接定位到<ul>节点后用string(),会获取该节点及其所有子节点的完整拼接文本,不会拆分重复返回。
举个HTML示例:
列表标题
- 第一项 链接文本
- 第二项
用//h3/following-sibling::ul[1]/string()会返回完整文本:第一项 链接文本第二项(保留原始格式),用normalize-space()则会整理为:第一项 链接文本 第二项。
内容的提问来源于stack exchange,提问作者Q With Only
相关产品推荐
相关产品推荐

