刮擦错误:类型错误:__init__() 'deny'出现意外的关键字参数



我已经组装了一个爬行器,它按照预期运行,直到我将关键字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__()

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

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

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

呃,它不是你实际传递给deny的函数吗?这就是Rule。__init__是Rule类的内部方法,在构造对象时调用。

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

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

最新更新