• scrapy--Itemloader数据清洗--input_processor和output_processor比较


    上一篇介绍了一些关于Itemloader的用法,如果没有看的话,去看一下,这两篇有一定的关联。本篇着重介绍数据清洗的一些方法。

     

    processor

    scrapy提供了一个processors类,里面有下列几种方法:Join,TakeFirst,MapCompose,Compose,Identity,SelectJmes

    对这几种方法的用法简单介绍一下:

    from scrapy.loader.processors import Join,TakeFirst,MapCompose,Compose,Identity,SelectJmes

    #以特定字符连接,示例以空连接,对字符串也能操作
    c = Join('')
    c(['a','b'])
    >>>'ab'
    #********************

    #传入函数的列表的每一个元素都会经过第一个函数,
    #得到值在经过第二个函数,如果有返回值为None的,则抛弃,
    #最后返回一个列表
    c=MapCompose(str.strip,str.upper)
    c(['  a   ','b'])
    >>>['A''B']
    #********************

    #如果传入一个列表时则会报下面这个错误
    #descriptor 'strip' requires a 'str' object but received a 'list'
    #但如果Compose的第一个函数是取列表的第一个元素,不会报错
    #即Compose是处理单一数据,MapCompose是批量处理
    c=Compose(str.strip,str.upper)
    c('  ac   ')
    >>>'AC'
    #********************

    #拿到JSON格式数据时会有作用
    proc = SelectJmes('a'
    proc({'a':'b','c':'d'})
    >>>'b'

    TakeFirst是取第一个不为空的元素,上一篇已经介绍过。


    input--output

    Item Loader 为每个 Item Field 单独提供了一个 Input processor 和一个 Output processor;

    Input processor 一旦它通过 add_xpath()add_css()add_value() 方法收到提取到的数据便会执行,执行以后所得到的数据将仍然保存在 ItemLoader 实例中;当数据收集完成以后,ItemLoader 通过 load_item() 方法来进行填充并返回已填充的 Item 实例。

    即input_processor是在收集数据的过程中所做的处理,output_processor是数据yield之后进行的处理,通过下面这个例子会更加理解:

    #type字段取出来时是'type': ['2室2厅', '中楼层/共6层']

    #定义一个在第一个元素后面加a的函数
    def adda(value):
        return value[0]+'a'

    type = scrapy.Field(output_processor = Compose(adda))
    >>>'type''2室2厅a'

    type = scrapy.Field(input_processor = Compose(adda))
    >>>'type': ['2室2厅a''中楼层/共6层a']
    #如果使用MapCompose的话,两个结果会一样,这也是Compose和MapCompose的区别

    当指定了取列表的第一个元素后,有些信息想保留整个列表便可以使用name_out,Identity()是取自身的函数。

    class TeItem(ItemLoader):
        default_out_processor = TakeFirst()
        name_out = Identity()

    也可以在基于scrapy.Item的item中定义一些规则:

    class Scrapy1Item(scrapy.Item):
        name = scrapy.Field(output_processor=Identity())


    优先级

    scrapy提供了很多种方式去自定义输入输出的内容,具有一定的优先级,优先级最高的是name_out这种,其次是在scrapy.Field()中定义的output_processor和input_processor,最后是default_out_processor = TakeFirst()这种。

     

    个人公众号附有精选资源,最新学习笔记,还有pycharm专业版的激活码噢,欢迎大家关注!

                   

  • 相关阅读:
    git this exceeds GitHub's file size limit of 100.00 MB
    使用vue-cli创建vue工程
    【转】Visual Studio Code必备插件
    linux安装openssl
    Centos7离线安装mysql8
    使用nmon来按频率采集数据
    Mac下编译android4.0.4遇到的问题
    32位ubuntu16.4编译android4.1.1
    vmvare安装vmtools菜单灰色
    Substrate 使用
  • 原文地址:https://www.cnblogs.com/python-dd/p/9550433.html
Copyright © 2020-2023  润新知