使用XPath提取h1后的零散文本失败,该如何获取目标完整文本?
解决XPath提取分散文本的问题
问题原因
你之前的//h1[@id='example']/following-sibling语法不完整,following-sibling必须指定节点类型(比如text()、node());而//h1[@id='example']/following-sibling::text()其实能匹配到目标文本节点,但可能因为文本包含引号、空白字符,或者工具显示问题导致你误以为没匹配到。
提取完整目标文本的方案
要拼接出My car is a Ferrari that goes 100 km/h,可以用以下几种方式:
方式1:一次性提取并合并所有后续节点的文本
使用XPath的string()函数,直接获取h1之后所有同级节点的合并文本:
string(//h1[@id='example']/following-sibling::node())
这个表达式会把h1之后的文本节点、abbr节点下的a标签文本全部合并,之后你只需要清理掉多余的引号和空白字符即可(比如去掉前后的双引号、换行和缩进)。
方式2:分节点提取后拼接
如果需要精准控制每个部分,可以分别提取各段文本再拼接:
- 提取开头文本:
//h1[@id='example']/following-sibling::text()[1]→ 拿到"My car is a " - 提取中间品牌文本:
//h1[@id='example']/following-sibling::abbr/a/text()→ 拿到Ferrari - 提取结尾文本:
//h1[@id='example']/following-sibling::text()[2]→ 拿到"that goes 100 km/h"
之后将这三部分拼接,再去除多余的引号和空白字符,就能得到目标文本。
补充说明
如果你的XPath工具支持字符串处理,也可以直接在表达式里清理内容,比如用normalize-space()去除多余空白:
normalize-space(replace(string(//h1[@id='example']/following-sibling::node()), '"', ''))
这个表达式会先合并所有文本,去掉双引号,再去除多余的换行、缩进和空格,直接返回My car is a Ferrari that goes 100 km/h。
内容的提问来源于stack exchange,提问作者Rodolfo
相关产品推荐
相关产品推荐

