2016-07-12 10 views
1

Ich versuche, eine Website durch Extrahieren aller Links mit "huis" (= "Haus" in Niederländisch) in ihnen zu kratzen. Nach http://doc.scrapy.org/en/latest/topics/spiders.html, ich versucheScrapy-Fehler: TypeError: __init __() hat ein unerwartetes Schlüsselwortargument 'Callback'

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 

from Funda.items import FundaItem 

class FundaSpider(scrapy.Spider): 
    name = "Funda" 
    allowed_domains = ["funda.nl"] 
    start_urls = [ 
     "http://www.funda.nl/koop/amsterdam/" 
    ] 

    rules = (
    Rule(LinkExtractor(allow=r'.*huis.*', callback='parse_item')) 
    ) 

    def parse_item(self, response): 
     item = FundaItem() 
     item['title'] = response.extract() 
     return item 

Allerdings erhalte ich die Fehlermeldung

Von einem früheren Beitrag (Scrapy Error: TypeError: __init__() got an unexpected keyword argument 'deny') es sieht aus wie ein möglicher Grund ist, nicht übereinstimmen Klammern, so dass die Schlüsselwort wird an Rule anstelle von LinkExtractor übergeben. Es scheint mir, dass in diesem Fall jedoch callback innerhalb der LinkExtractor Klammer wie vorgesehen ist.

Irgendwelche Ideen, was diesen Fehler verursacht?

Antwort

3

Ja, callback wird definitiv an LinkExtractor übergeben. Das scheint tatsächlich das Problem zu sein, weil ich callback unter den erwarteten Parametern für diese Klasse in the documentation nicht sehe.

Ich sehe, dass die Rule Klasse hat einen Callback-Parameter in der Dokumentation aufgeführt. Also vielleicht bist du angenommen, um es an Regel statt LinkExtractor zu übergeben?

Rule(LinkExtractor(allow=r'.*huis.*'), callback='parse_item') 

Wenn Sie denken, „aber warum der Antworter der verknüpften Frage callback innerhalb des LinkExtractor Anruf gelegt hat?“, Ich glaube, Sie können die Verschachtelung der Klammern werden falsch interpretiert, die zugegebenermaßen etwas verwirrend ist. Das Ändern des Layouts macht es ein wenig klarer:

rules = (
    Rule(
     LinkExtractor(
      allow=[r'/*'], 
      deny=('blogs/*', 'videos/*',) 
     ), 
     callback='parse_html' 
    ), 
) 
Verwandte Themen