You need to enable JavaScript to run this app. Scrapy中使用XPath提取p、li不同标签下的纯文本内容
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 04:54:03