【问题标题】:Scrapy Error: TypeError: __init__() got an unexpected keyword argument 'deny'Scrapy 错误:TypeError:__init__() 得到了一个意外的关键字参数“拒绝”
【发布时间】:2015-07-31 01:23:25
【问题描述】:

我已经组装了一个蜘蛛,它按预期运行,直到我将关键字 deny 添加到规则中。

这是我的蜘蛛:

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from bhg.items import BhgItem

class BhgSpider (CrawlSpider):
    name = 'bhg'
    start_urls = ['http://www.bhg.com/holidays/st-patricks-day/']
    rules = (Rule(LinkExtractor(allow=[r'/*'], ),
                  deny=('blogs/*', 'videos/*', ),
                  callback='parse_html'), )

def parse_html(self, response):
    hxs = Selector(response)
    item = BhgItem()

    item['title'] = hxs.xpath('//title/text()').extract()
    item['h1'] = hxs.xpath('//h1/text()').extract()
    item['canonical'] = hxs.xpath('//link[@rel = \"canonical\"]/@href').extract()
    item['meta_desc'] = hxs.xpath('//meta[@name=\"description"]/@content').extract()
    item['url'] = response.request.url
    item['status_code'] = response.status
    return item

当我运行这段代码时,我得到:

deny=('blogs/', 'videos/', ),), )
TypeError: __init__() got an unexpected keyword argument 'deny'

我做错了什么?好吧,我猜一个函数或其他东西没有期待额外的参数(deny)但是哪个函数? parse_html()?

我没有定义任何其他蜘蛛,也没有__init__()

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    deny 应该作为参数传递给LinkExtractor,但是你把它放在括号之外并传递给Rule。把它移到里面,这样你就有了:

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

    __init__ 是在实例化类时传递参数时调用的方法,就像您在此处对 RuleLinkExtractor 类所做的那样。

    【讨论】:

    • 就像我上面说的,我想我从来没有检查过我把deny放在哪里。非常感谢
    【解决方案2】:

    呃,这不是你真正传递拒绝的函数吗?那将是规则。 __init__ 是构造对象时调用的 Rule 类的内部方法。

    我在网上找到的示例将 deny= 传递给 LinkExtractor,而不是规则。所以你想要:

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

    【讨论】:

    • 哇,我只是瞎了。我想我从来没有检查过deny,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2017-05-10
    • 1970-01-01
    • 2017-10-16
    • 2020-10-22
    • 2021-11-17
    • 2016-11-01
    相关资源
    最近更新 更多