XPath如何按原顺序提取同级纯文本与a标签内文本
解决方案
你之前拆分提取的方式会丢失节点的原始排列顺序,直接用按文档顺序遍历所有文本节点的方案即可,不需要分开提取直接文本和子标签文本。
方法1:通用XPath写法(兼容所有支持XPath的解析库)
直接在目标<p>节点上执行.//text()提取规则即可:
- 这个XPath会选中当前节点下所有层级的文本节点,严格按照HTML中的出现顺序返回,不会出现顺序错乱问题
- 空标签
<br>本身没有文本内容,不会被提取出来 - 提取后只需要清理每个文本项首尾的换行、缩进空白,过滤掉空字符串后拼接即可
示例代码:
# 以parsel/Scrapy选择器为例 text_nodes = p_selector.xpath('.//text()').getall() result = ''.join([node.strip() for node in text_nodes if node.strip()]) # 执行后result即为"ABCDEF"
方法2:lxml原生方法(适用于lxml/Scrapy环境)
如果你的解析底层用的是lxml,可以直接调用元素节点的text_content()方法,该方法会自动按文档顺序拼接节点内所有文本,拿到原始文本后清理多余空白即可:
p_element = root.xpath('//p')[0] raw_text = p_element.text_content() # 移除所有换行、缩进类空白 result = ''.join(raw_text.split()) # 执行后result即为"ABCDEF"
之前方案的问题说明
你之前用xpath(text())仅提取当前节点的直接子文本节点,用xpath(./*)仅提取子元素节点,相当于把两类交叉排列的节点拆成了两个独立列表,完全丢失了原有的先后顺序,自然无法正确拼接。
内容的提问来源于stack exchange,提问作者Tudis Lei
相关产品推荐
相关产品推荐

