如何使用XPath提取p标签内href链接外的文本并输出目标列表
混合链接与纯文本的段落内容提取方案
没有能在所有XPath版本下通用的、一步到位直接输出目标列表的纯XPath写法,根据你使用的解析器支持的XPath版本,选对应方案即可:
通用兼容方案(支持所有XPath 1.0解析器,含lxml、Scrapy、浏览器原生XPath、Java XPath等绝大多数常用场景)
- 首先用如下XPath按DOM原始顺序抓取目标p标签下所有文本节点(包含a标签内文本、p标签直属的非链接文本):
//div[@class="content clearfix"]/p[2]//text()
- 对抓取到的文本节点做极简单的后置处理即可得到目标结果:
- 遍历每个文本片段,去除首尾的换行、空格、制表符、逗号等分隔符
- 过滤掉处理后为空的内容
最终输出的列表就是你需要的["text1", "text2", "text3", "text4", "text5", "text6", "text7", "text8", "text9"],完全保留原文顺序,不会漏内容也不会带冗余字符。
注意不要用
//p[2]/a/text() | //p[2]/text()这类联合查询写法,不少XPath 1.0解析器不会严格按DOM顺序返回两类节点的结果,很容易出现文本排序错乱的问题。
XPath 2.0+ 一步到位方案(仅适用于支持高版本XPath的解析器,如Saxon、BaseX等)
如果你的解析器支持XPath 2.0及以上版本,可以直接用如下表达式直接输出过滤后的有序结果,不需要额外后置处理:
//div[@class="content clearfix"]/p[2]//text() ! normalize-space() ! replace(., '^,|,$', '')[. != '']
表达式逻辑说明:
- 首先按DOM顺序抓取p节点下所有层级的文本节点
normalize-space()清除每个文本片段首尾的空白字符,合并内部连续空白replace(., '^,|,$', '')清除每个文本片段首尾残留的逗号分隔符- 最后过滤掉处理后为空的片段,直接返回目标文本列表
内容的提问来源于stack exchange,提问作者Life after Guest
相关产品推荐
相关产品推荐

