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



我正在尝试抓取一个页面之间不显示相同数据的网站。我希望我的蜘蛛为它无法抓取的每个属性返回默认值。我知道这可以像这样在项目声明中完成:

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

但是,这种方法似乎不再有效(我使用的是 Scrapy 1.3.0)。如果我在找不到值时尝试导出此特定字段,则得到:

KeyError: 'myfield'

有解决方法吗?

这是我为解决这个问题所做的工作。如@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

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

class DefaultValuesPipeline(object):
    def process_item(self, item, spider):
        item.setdefault('field1', 'value1')
        item.setdefault('field2', 'value2')
        # ...
        return item

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

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

最新更新