刮擦错误:类型错误:__init__() 'callback' 遇到意外的关键字参数



我试图通过提取所有带有"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__)得到了一个意想不到的关键字参数"deny")看起来一个可能的原因是括号不匹配,因此关键字被传递给Rule而不是LinkExtractor。然而,在我看来,在这种情况下,callback按预期在LinkExtractor括号内。

知道是什么导致了此错误吗?

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

我看到 Rule确实在文档中列出了一个回调参数。所以也许你应该把它传递给规则而不是链接提取器?

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

如果你在想"但是为什么链接问题的回答者把callback放在LinkExtractor电话里?",我认为你可能误解了括号的嵌套,这确实有些令人困惑。更改布局使其更清晰:

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

最新更新