2017-08-15 4 views
1

J'ai essayé de reproduire le tutoriel Scrapy en utilisant Xpath et continuer à courir dans ERROR: Spider must return Request, BaseItem or None, got 'dict' in <GET http://quotes.toscrape.com/> Je ne sais pas comment résoudre ce problème.Scrapy ERROR: Spider doit retourner Request, BaseItem ou None, a obtenu 'dict'

Je vais partager des extraits de deux fichiers qui doivent être juste assez pour le débogage:

1) Mon araignée 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() 

Pour votre information: Dans le cas où vous comparez cela à la tutorial et se demandent pourquoi j'ai changé le extract_first() en extract(), c'est parce que je était en train de voir une autre erreur exceptions.AttributeError: 'SelectorList' object has no attribute 'extract_first' qui n'est pas liée à cette question je crois.

+0

Quelle version de Scrapy vous utilisez? –

Répondre

1

Vous retournez un dictionnaire comme l'erreur dit et non un élément

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 
+1

Eh bien, 'dict' est un type supporté en effet - voir [le code] (https://github.com/scrapy/scrapy/blob/eb5d396527c2d63fa6475dfd9b6372a19bce5488/scrapy/core/scraper.py#L184). –

+0

Ouais je pensais que c'était utilisable à cause de https://github.com/scrapy/scrapy/issues/1064. 'pip list' me dit que ma version est 0.24.4 – Sid

+0

@Sid, oui vous pouvez mettre à jour la version et vous devriez être bon –