2017-08-15 3 views
1

Ich habe versucht, das Scrapy-Tutorial mit Xpath zu reproduzieren und lief weiter in ERROR: Spider must return Request, BaseItem or None, got 'dict' in <GET http://quotes.toscrape.com/> Nicht sicher, wie das zu beheben ist.Scrapy ERROR: Spider muss Request, BaseItem oder None zurückgeben, bekam 'dict'

Ich werde Schnipsel aus zwei Dateien teilen, die für das Debuggen nur genug sein sollte:

1) Meine Spinne 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() 

FYI: Falls Sie dies mit der tutorial vergleichen und sich wundern, warum ich die extract_first() auf extract() umgestellt habe, liegt es daran, dass ich sah einen anderen Fehler exceptions.AttributeError: 'SelectorList' object has no attribute 'extract_first', die mit dieser Frage nicht verwandt ist, glaube ich.

+0

Welche Version von Scrapy verwenden Sie? –

Antwort

1

Sie kehren ein Wörterbuch als der Fehler sagt und den Artikel nicht

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

Nun, "dict" ist in der Tat eine unterstützte Art - siehe [den Code] (https://github.com/scrapy/scrapy/blob/eb5d396527c2d63fa6475dfd9b6372a19bce5488/scrapy/core/scraper.py#L184). –

+0

Ja, ich dachte, dass es wegen https://github.com/scrapy/scrapy/issues/1064 verwendbar war. 'Pip-Liste' sagt mir, dass meine Version ist 0,24.4 – Sid

+0

@Sid, ja, Sie können die Version aktualisieren und Sie sollten gut sein –

Verwandte Themen