上一篇介紹了一些關於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專業版的激活碼噢,歡迎大家關注!

