Scrapy中使用XPath提取p、li不同标签下的纯文本内容
Scrapy 不定结构目标区域纯文本提取实现方案
原有写法的问题定位
之前几版提取逻辑没达到预期效果,核心问题有两个:
- 选中目标div节点后直接调用
extract(),拿到的是带全套子标签的HTML源码,自然会混着p、ul、li的标签字符串,不是需要的纯文本 - 仅在XPath末尾追加
/text()的写法,只能抓取节点直接相邻的文本,无法穿透p、ul、li等多层嵌套标签,拿不到深层的列表项、段落内容
可直接落地的有效提取逻辑
以下两种实现均可同时兼容「p标签承载纯段落」「ul无序列表承载内容」两种不固定的文本形式,不需要额外写结构判断分支:
方案1:纯XPath提取+文本节点拼接
不依赖额外清洗工具,从根源上只抓取文本节点,完全避免标签残留:
# 定位到目标div容器 target_div = info.xpath('.//article/div[@class="border-bottom-grau"][1]') # 提取容器下所有非空白的文本节点,自动穿透所有嵌套层级 all_valid_text = target_div.xpath('./descendant-or-self::text()[normalize-space()]').extract() # 用分号拼接所有有效内容,自动适配段落、列表的结构差异 info_Aufgabengebiet = '; '.join(txt.strip() for txt in all_valid_text)
写法适配性说明:
descendant-or-self::text()会遍历目标div下所有层级的文本,不管文本是在p标签内,还是嵌套在ul/li的多层结构里,都能完整抓取[normalize-space()]过滤器会自动跳过标签之间的换行、缩进等无意义空白字符,不会把页面排版产生的空内容算进提取结果
方案2:标签全移除+空白清洗
适合目标区域内部结构更复杂的场景,直接对原始HTML做标签剥离:
from w3lib.html import remove_tags # 取目标div的原始HTML内容 raw_content = info.xpath('.//article/div[@class="border-bottom-grau"][1]').get() # 移除所有内部嵌套标签,只保留纯文本 pure_text = remove_tags(raw_content) # 把拆分后的非空片段用分号拼接为统一字符串 info_Aufgabengebiet = '; '.join(segment.strip() for segment in pure_text.splitlines() if segment.strip())
效果说明
两种方案都不需要单独判断目标区域是列表结构还是段落结构,最终输出为无任何HTML标签残留的纯文本,列表项、段落内容会自动用分号拼接为统一字符串,完全匹配提取需求。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

