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專業版的激活碼噢,歡迎大家關注!

               

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM