我尝试使用Xpath重现Scrapy教程并继续运行ERROR: Spider must return Request, BaseItem or None, got 'dict' in <GET http://quotes.toscrape.com/>
不确定如何解决这个问题。
我要从两个文件中共享片段,这些文件应该足以进行调试:
1)我的蜘蛛quotes_spider.py
from scrapy.spider import Spider
from scrapy import Request
class QuoteSpider(Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.xpath('//div[@class="quote"]'):
yield {
'text': quote.xpath('.//span[@class="text"]/text()').extract(),
'author': quote.xpath('.//small[@class="author"]/text()').extract(),
'tags': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract(),
}
2)items.py
from scrapy.item import Item
class QuotesbotItem(Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
仅供参考:如果您将其与tutorial进行比较,并想知道我将extract_first()
切换为extract()
的原因,那是因为我看到了另一个错误{{1我认为这与这个问题无关。
答案 0 :(得分:2)
您正在返回错误所说的字典,而不是项目
class QuoteSpider(Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.xpath('//div[@class="quote"]'):
item = QuotesbotItem()
item['text'] = quote.xpath('.//span[@class="text"]/text()').extract()
item['author'] = quote.xpath('.//small[@class="author"]/text()').extract()
item['tags'] = quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
yield item