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

使用CSS选择器无法提取目标值:Scrapy提取Title文本遇问题

嗨,我来帮你搞定这个Scrapy文本提取的问题!

你遇到的问题是因为div.title-container div.title::text这个选择器的行为和你预期的不一样。咱们先拆解下原因:

  • 如果你的选择器是div.title::text(没有空格),它只会抓取div.title元素自身的直接文本节点,不包含子元素(比如那个<span>)的文本;但你的目标文本"Title"被注释和<span>隔开,属于div.title下的一个独立文本节点,可能前面有大量空白,导致extract_first()没抓到它。
  • 要是你不小心写成了div.title ::text(带空格),那它会抓取div.title下所有后代的文本节点,这时候第一个匹配的就是<span>里的"1",所以你拿到了这个结果。

给你几个靠谱的解决方案:

1. 用XPath精准定位(推荐)

这个方法能直接选中那个非空白的目标文本节点,最稳定:

title = response.xpath('//div[@class="title"]/text()[normalize-space()]').get()

normalize-space()会自动去掉文本前后的空白,并且只筛选出非空的文本节点,刚好命中你要的"Title"。

2. CSS选择器结合过滤

如果更习惯用CSS,可以先抓取所有相关文本,再过滤掉空白内容:

# 先拿到所有后代文本,再筛选出非空白的内容
filtered_texts = [text.strip() for text in response.css('div.title-container div.title ::text').getall() if text.strip()]
# 目标文本是第二个元素(第一个是"1")
title = filtered_texts[1]

⚠️ 注意:这个方法依赖文本的顺序,如果页面结构调整,可能需要修改索引,稳定性不如XPath。

3. 更精准的XPath位置选择

如果你确定目标文本是div.title下第一个非空白的独立文本节点,也可以这么写:

title = response.xpath('//div[@class="title"]/text()[normalize-space()][1]').get()

试试上面的方法,应该就能顺利提取到"Title"啦!

内容的提问来源于stack exchange,提问作者Pradeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:17:42