在scray中嵌套项目数据的正确方法

2024-10-01 11:41:26 发布

您现在位置:Python中文网/ 问答频道 /正文

嵌套项数据的正确方法是什么?在

例如,我想要一个产品的输出:

{
'price': price,
'title': title,
'meta': {
    'url': url,
    'added_on': added_on
}

我有恶心的东西共:

^{pr2}$

现在,我的方法是根据新项目模板重新格式化管道中的整个项目:

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

这是正确的方法来处理这个问题,还是有一个更直接的方法来处理这个问题而不破坏框架的哲学?在


Tags: 数据项目方法urlfieldadded管道title
2条回答

更新来自注释:看起来nested loaders是更新的方法。另一条评论指出,这种方法在序列化期间会导致错误。在

最好的方法是创建mainmeta项类/装入器。在

from scrapy.item import Item, Field
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst


class MetaItem(Item):
    url = Field()
    added_on = Field()


class MainItem(Item):
    price = Field()
    title = Field()
    meta = Field(serializer=MetaItem)


class MainItemLoader(ItemLoader):
    default_item_class = MainItem
    default_output_processor = TakeFirst()


class MetaItemLoader(ItemLoader):
    default_item_class = MetaItem
    default_output_processor = TakeFirst()

示例用法:

^{pr2}$

之后,您可以通过创建更多的“子项”在将来轻松扩展项

我认为在spider中构建字典会更简单。这里有两种不同的方法,都能达到相同的效果。这里唯一可能的解除中断是处理器应用于item['meta']字段,而不是应用于item['meta']['added_on']和item['meta']['url']字段。在

def parse(self, response):
    item = MyItem()
    item['meta'] = {'added_on': response.css("a::text").extract()[0]}
    item['meta']['url'] = response.xpath("//a/@href").extract()[0]
    return item

有没有什么特别的原因让你想用这种方式来构造它而不是解压元字段?在

相关问题 更多 >