【问题标题】:Scrapy ERROR: Spider must return Request, BaseItem or None, got 'dict'Scrapy 错误:Spider 必须返回 Request、BaseItem 或 None,得到 'dict'
【发布时间】:2017-08-15 09:35:46
【问题描述】:

我尝试使用 Xpath 复制 Scrapy 教程并不断遇到ERROR: Spider must return Request, BaseItem or None, got 'dict' in <GET http://quotes.toscrape.com/> 不知道如何解决这个问题。

我将分享两个文件中的 sn-ps,这应该足以用于调试:

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(),那是因为我看到了另一个错误exceptions.AttributeError: 'SelectorList' object has no attribute 'extract_first',我相信这与这个问题无关。

【问题讨论】:

  • 你用的是什么版本的 Scrapy?

标签: python xpath scrapy scrapy-spider


【解决方案1】:

您正在返回一个字典,如错误所说,而不是一个项目

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2018-01-28
相关资源
最近更新 更多