Scrapy Response返回None但语法无误,请求排查问题原因
解决Scrapy爬虫中name字段返回None的问题
你的TerrorSpider代码返回200状态码但name字段始终为None,核心问题是嵌套选择器的路径错误:
当你通过for filme in response.css('h3 a')遍历得到的每个filme已经是<h3>下的<a>元素,此时再用filme.css('h3 a::text')去查找,相当于在当前<a>元素的子节点里匹配h3 a,自然找不到内容,返回None。而Scrapy Shell中直接执行response.css('h3 a::text').get()是全局查找整个页面的h3 a元素,所以能正常获取结果。
参考你提供的可正常运行的ImdbSpider代码逻辑,这里提供两种修正方案:
方案一:直接遍历元素(简化写法)
import scrapy class TerrorSpider(scrapy.Spider): name = 'terror' start_urls = ['http://books.toscrape.com/catalogue/category/books/travel_2/index.html'] def parse(self, response): for book in response.css('h3 a'): yield { 'name': book.css('::text').get() # 等价写法:book.get() 或 book.xpath('./text()').get() }
方案二:遍历父元素
(与ImdbSpider逻辑完全对齐)
import scrapy class TerrorSpider(scrapy.Spider): name = 'terror' start_urls = ['http://books.toscrape.com/catalogue/category/books/travel_2/index.html'] def parse(self, response): # 遍历每个<h3>父元素,和Imdb遍历.titleColumn的逻辑一致 for book in response.css('h3'): yield { 'name': book.css('a::text').get() }
两种方案都能正确提取书籍名称,其中方案二的结构和你参考的ImdbSpider完全匹配,更容易理解和维护。
内容的提问来源于stack exchange,提问作者Vinicius
相关产品推荐
相关产品推荐

