Scrapy错误:TypeError:__ init __()得到一个意外的关键字参数'callback'

时间:2016-07-12 17:29:40

标签: python scrapy

我试图通过提取所有链接中的“huis”(=荷兰语中的“house”)来搜索网站。关注http://doc.scrapy.org/en/latest/topics/spiders.html,我正在尝试

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

但是,我收到错误消息

Rule(LinkExtractor(allow=r'.*huis.*', callback='parse_item'))
TypeError: __init__() got an unexpected keyword argument 'callback'

从上一篇文章(Scrapy Error: TypeError: __init__() got an unexpected keyword argument 'deny')看,可能的原因是括号不匹配,因此关键字会传递给Rule而不是LinkExtractor。在我看来,在这种情况下,callback符合预期的LinkExtractor括号。

任何想法导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:3)

是的,callback肯定会传递给LinkExtractor。实际上,这似乎是问题所在,因为我在the documentation中的该类的预期参数下看不到callback

我看到Rule 在文档中列出了回调参数。那么也许你假设将它传递给Rule而不是LinkExtractor?

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

如果您正在思考"但为什么链接问题的回答者将callback置于LinkExtractor电话中?",我认为您可能会误解括号的嵌套,这无疑是有点令人困惑的。改变布局使它更清晰:

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