在Scrapy中使用规则和请求会抛出异常TypeError:__ init __()获取关键字参数'callback'的多个值

时间:2013-09-25 07:34:23

标签: python scrapy

我是scrapy的初学者,我一直在尝试执行以下工作流程:从页面A开始,这是一个结果搜索页面,其中包含url end为数字的完整文章的链接。我的目的是获取每个结果搜索页面的每个链接,访问链接并废弃完整的文章。

我遍历每个页面,收集带有以下规则的链接:

   rules = (Rule(SgmlLinkExtractor(allow=(r'\d+',)), callback='parse_short_story',follow=True),)

在完成收集链接并删除当前页面的完整文章后,每个都确保搜索页面的最后一位数字迭代到下一位数字。

parse_short_story方法仅使用select来过滤html页面的部分,然后循环遍历剩余部分以获取完整故事的链接并将其传递给请求:

for short_story in short_stories:
        item = DmozItem()

        full_story_link = short_story.select(".//h2/a/@href").extract()

        if full_story_link:
            yield Request(full_story_link, self.parse_full_story, callback='self.parse_full_story', errback=lambda _: item, meta=dict(item=item),)            

        items.append(item)
    return items     

根据我对sc {的tutorial的理解,我需要在解析器方法结束时返回项目,以便规则正确附加到项目的最终列表中,我可以将其放入json文件中或者由控制台运行的其他东西。注意响应下面的这部分并返回崩溃的呼叫。我无法弄清楚如何同时使用请求和退货项目。

方法parse_full_story获取与response类似的parse_short_story参数,并使用

恢复我作为参数发送的项目
    item = response.meta.get('item')

在我的项item上正确设置所需信息后,我使用了return item

总之,

我的期望是该规则会使用parse_short_story的回调来处理包含完整文章链接的搜索页面,而对于每个页面的每个链接,parse_full_story会访问这些链接的完整文章,废弃我想要的内容,添加到item项目,然后退出,希望最后扫描所有完整的文章。

显然我的理解是错误的,我收到错误: yield Request(full_story_link, self.parse_full_story, callback='self.parse_full_story', errback=lambda _: item, meta=dict(item=item),) exceptions.TypeError: __init__() got multiple values for keyword argument 'callback' 您可以找到完整的可运行代码here。在运行时,您将看到它不断抛出异常。如果执行直接修复是可行的,并且对此有什么问题进行简短解释,我会很感激,因为类似的问题会让我在网上找到Django相关的问题。

1 个答案:

答案 0 :(得分:0)

只放置一个回调参数,使用self.parse_full_storyRequest()期望可调用; see here

“回调名称字符串”版本仅适用于规则(see here

使用

yield Request(full_story_link,
    self.parse_full_story,
    errback=lambda _: item,
    meta=dict(item=item),
)

而不是

yield Request(full_story_link,
    self.parse_full_story, callback='self.parse_full_story',
    errback=lambda _: item,
    meta=dict(item=item),
)