You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scrapy爬虫提取含嵌套标签的p内容时遇阻求助

解决Scrapy嵌套标签文本提取中断的问题

这种嵌套标签导致的文本提取不完整问题,在Scrapy爬取的时候确实很容易碰到,我给你几个实用的解决办法:

方法1:使用CSS选择器获取所有子级文本后拼接

当p标签里有strong这类嵌套标签时,p::text只能获取p标签直接子节点的文本,嵌套在strong里的内容是p的孙节点,所以拿不到。这时候可以用*::text匹配p下所有层级的文本节点,再用join()把列表里的文本拼接成完整内容:

# 提取单个p标签的完整文本
full_text = ' '.join(response.css('div.entry-content p *::text').getall()).strip()

# 如果是多个p标签,遍历处理
for p_node in response.css('div.entry-content p'):
    p_text = ' '.join(p_node.css('*::text').getall()).strip()
    # 后续处理逻辑,比如和h3标题配对

方法2:使用XPath的string()方法(更简洁)

XPath的string()函数可以直接提取指定节点内的所有文本内容,不管嵌套多少层标签,一步就能拿到干净的文本:

# 提取单个p标签的完整文本
full_text = response.xpath('string(//div[@class="entry-content"]/p)').get()

# 遍历多个p标签的情况
for p_node in response.xpath('//div[@class="entry-content"]/p'):
    p_text = p_node.xpath('string(.)').get()
    # 处理逻辑

为什么之前的方法失效?

  • 用p::text strong::text:这种写法会分别返回p的直接文本和strong的文本,但如果没有拼接的话,可能只会取到第一个匹配项,或者返回的是两个独立的文本片段,导致看起来“提取中断”;
  • 去掉::text:会返回整个p节点的HTML源码,自然会包含<strong>这类标签,不符合需求。

这两种方法都能完美解决嵌套标签的文本提取问题,你可以根据自己的代码习惯选择其中一种~

内容的提问来源于stack exchange,提问作者Schneejäger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:35