如何编写XPath提取span文本时排除内部new-tag的Neu内容
XPath精准提取文本(排除子标签内容)
问题背景
待处理HTML片段:
<span class="jsx-2465661648"><span class="jsx-2748387826 new-tag">Neu</span>Brunel GmbH NL Bielefeld</span> <span class="jsx-2465661648">Arvato Supply Chain Solutions</span>
提取目标为两个字符串:
Brunel GmbH NL BielefeldArvato Supply Chain Solutions
使用初始XPath //span[@class="jsx-2465661648"] 提取时,会返回混入子标签内容的错误结果 NeuBrunel GmbH NL Bielefeld,需要排除内部class为new-tag的子span内的"Neu"文本。
错误原因
直接选中目标span元素后读取全量文本,会递归提取该元素下所有后代节点的文本并拼接,因此子标签内的"Neu"会被一并纳入结果。
可用XPath写法
通用最简写法
XPath中text()仅匹配当前节点下的直属文本子节点,不会递归读取子元素内部的内容,直接使用以下语句即可得到正确结果:
//span[@class="jsx-2465661648"]/text()
如果返回结果带前后多余空格、换行,可套normalize-space()做清洗:
//span[@class="jsx-2465661648"]/normalize-space(text())
执行后会直接返回两个目标字符串,完全不会混入子标签的"Neu"内容。
复杂场景适配写法
如果目标span后续可能新增其他需要排除的子标签,可显式跳过指定子节点提取内容,示例如下:
//span[@class="jsx-2465661648"]/node()[not(contains(@class,"new-tag"))]/text()
该写法会自动跳过带new-tag类名的子标签,提取其余节点的文本,适配子标签位置不固定的复杂DOM场景。
内容的提问来源于stack exchange,提问作者Bao Hoang
相关产品推荐
相关产品推荐

