我试图抓取一个网页,该网站不会在页面之间显示相同的数据。我喜欢我的蜘蛛为每个无法抓取的属性返回一个默认值。我知道这可以在项目声明中完成,如下所示:
class MyItem(scrapy.Item):
myfield = scrapy.Field(default='NULL')
然而,这种方法似乎不再起作用了(我使用Scrapy 1.3.0)。如果我在找不到值时尝试导出此特定字段,我得到:
KeyError: 'myfield'
有解决方法吗?
答案 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类来实现所需的行为。