如何在Scrapy中设置Item.Field()的默认值?

时间:2017-02-02 09:29:13

标签: python scrapy

我试图抓取一个网页,该网站不会在页面之间显示相同的数据。我喜欢我的蜘蛛为每个无法抓取的属性返回一个默认值。我知道这可以在项目声明中完成,如下所示:

class MyItem(scrapy.Item):
     myfield = scrapy.Field(default='NULL')

然而,这种方法似乎不再起作用了(我使用Scrapy 1.3.0)。如果我在找不到值时尝试导出此特定字段,我得到:

KeyError: 'myfield'

有解决方法吗?

2 个答案:

答案 0 :(得分:6)

以下是我为解决此问题所做的工作。正如@mizhgun所提到的,您可以使用管道设置默认值。如果您需要迭代字段,请使用field参数而不是内置item.items()方法,因为items()仅返回填充的字段:

class DefaultValuesPipeline(object):

    def process_item(self, item, spider):

        for field in item.fields:
            item.setdefault(field, 'NULL')

    return item

答案 1 :(得分:3)

大约4年前从Scrapy中删除了对字段默认值的支持(我只是好奇你以前使用过哪个版本)。根据Pablo Hoffman的建议,方法是通过管道填充具有默认值的项目:

s

https://groups.google.com/d/msg/scrapy-users/-v1p5W41VDQ/0W9SIB07iDIJ

但是,您可以扩展默认的Field类来实现所需的行为。