如何实现对值进行预处理?
对于传递进items的值,首先明白有两个动作,进和出,那就可以分别对这两个动作进行逻辑处理
#!/usr/bin/python3 # -*- coding: utf-8 -*- __author__ = 'beimenchuixue' __blog__ = 'http://www.cnblogs.com/2bjiujiu/' import hashlib import scrapy import re from w3lib.html import remove_tags from scrapy.loader import ItemLoader from scrapy.loader.processors import TakeFirst, Join, MapCompose from tools.shared import get_md5, go_remove_tag class AllItemLoader(ItemLoader): """ 通过自定义itemloader要求都取列表中第一个值 """ default_output_processor = TakeFirst() def get_md5(url): """对获取的URL进行md5""" m = hashlib.md5() m.update(bytes(url, encoding='utf-8')) return m.hexdigest() # 把对应的内容,去掉标签、空格、空行 def go_remove_tag(value): content = remove_tags(value) return re.sub(r'[ s]', '', content) def comeback(value): """啥也不干,直接返回""" return value class ENet(scrapy.Item): article_id = scrapy.Field( # 进来的值预处理 input_processor=MapCompose(get_md5) ) article_url = scrapy.Field() title = scrapy.Field() content = scrapy.Field( input_processor=MapCompose(go_remove_tag), # 从items出去的值进行拼接处理 output_processor=Join('') ) publish_time = scrapy.Field() come_form = scrapy.Field( # 获得结果还是列表 output_processor=MapCompose(comeback) )
input_processor 进 处理
output_processor 出 处理
MapCompose 绑定处理函数
Join 进行拼接
TakeFirst 出,取列表第一个值
items如何把spider中解析到的值进行处理?
spider中获得的是存放在列表中,而传入绑定函数中是按顺序一个一个分别传入处理函数进行处理