随着您的项目变得越来越大并获得越来越多的蜘蛛,维护成为一个基本问题,特别是当您必须为每个蜘蛛处理许多不同的解析规则,有很多例外,但也想重用通用处理器时。

项目加载器旨在减轻解析规则的维护负担,同时不失去灵活性,同时提供扩展和覆盖它们的便捷机制。因此,Item Loaders支持传统的Python类继承,以处理特定蜘蛛(或蜘蛛组)的差异。

例如,假设某个特定站点用三个破折号(例如)包含其产品名称,并且您不希望最终在最终产品名称中删除这些破折号---Plasma TV---

以下是通过重用和扩展默认Product Item LoaderProductLoader)来删除这些破折号的方法:

from scrapy.loader.processors import MapCompose
from myproject.ItemLoaders import ProductLoader

def strip_dashes(x):
    return x.strip('-')

class SiteSpecificLoader(ProductLoader):
    name_in = MapCompose(strip_dashes, ProductLoader.name_in)

扩展项加载器非常有用的另一种情况是,当您有多种源格式时,例如XML和HTML。在XML版本中,您可能希望删除CDATA事件。以下是如何执行此操作的示例:

from scrapy.loader.processors import MapCompose
from myproject.ItemLoaders import ProductLoader
from myproject.utils.xml import remove_cdata

class XmlProductLoader(ProductLoader):
    name_in = MapCompose(remove_cdata, ProductLoader.name_in)

这就是您通常扩展输入处理器的方式。

对于输出处理器,更常见的是在字段元数据中声明它们,因为它们通常仅依赖于字段而不依赖于每个特定站点解析规则(如输入处理器那样)。另请参见: 声明输入和输出处理器

还有许多其他可能的方法来扩展,继承和覆盖您的Item Loaders,并且不同的Item Loaders层次结构可能更适合不同的项目。Scrapy只提供机制; 它不会强加您的Loaders集合的任何特定组织 – 这取决于您和您的项目的需求。

评论被关闭。