使用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
相关产品推荐
相关产品推荐

