嵌套Item数据的正确方法是什么?
例如,我想要一个产品的输出:
{
'price': price,
'title': title,
'meta': {
'url': url,
'added_on': added_on
}
我有擦伤。项目:
class ProductItem(scrapy.Item):
url = scrapy.Field(output_processor=TakeFirst())
price = scrapy.Field(output_processor=TakeFirst())
title = scrapy.Field(output_processor=TakeFirst())
url = scrapy.Field(output_processor=TakeFirst())
added_on = scrapy.Field(output_processor=TakeFirst())
现在,我这样做的方式是根据新的项目模板重新格式化管道中的整个项目:
class FormatedItem(scrapy.Item):
title = scrapy.Field()
price = scrapy.Field()
meta = scrapy.Field()
管道中:
def process_item(self, item, spider):
formated_item = FormatedItem()
formated_item['title'] = item['title']
formated_item['price'] = item['price']
formated_item['meta'] = {
'url': item['url'],
'added_on': item['added_on']
}
return formated_item
这是正确的方法吗?或者有没有一种更直接的方法来解决这个问题,而不破坏框架的哲学?
2条答案
按热度按时间shyt4zoc1#
更新来自评论:看起来嵌套加载器是更新的方法。另一条评论指出这种方法会在序列化过程中导致错误。
最好的方法是创建一个
main
和一个meta
项目类/加载器。样品使用:
之后,您可以通过创建更多的“子项”来轻松扩展您的项目
nimxete22#
我认为在spider中构造字典会更简单。这里有两种不同的方法,都能达到相同的结果。这里唯一可能的dealbreaker是处理器应用于item['meta']字段,而不是item['meta']['added_on']和item['meta']['url']字段。
有没有一个特定的原因,你想构造它的方式,而不是解包的 meta字段?