我有一项值无论怎么处理,始终都是列表无法提取第一个。
因为提取的日期值后面会有一个点:2018/09/04 ·
所以我想着先使用达特——conver处理一下再转化为日期格式,最后用TakeFirst提取第一个
def date_convert(value): value = ''.join(value) #变为字符串 value = value.strip().replace('·','').strip() try: date = datetime.datetime.strptime(value, "%Y/%m/%d").date() except Exception as e: print(e) date = datetime.datetime.now().date() return date class BoleArticleItem(scrapy.Item): date = scrapy.Field( input_processor = MapCompose(date_convert), output_precessor = TakeFirst() )
结果和预计不一样:
<class 'list'>: [datetime.date(2018, 9, 3), datetime.date(2018, 9, 17), datetime.date(2018, 9, 17)]
打印依旧有报错信息:
time data '' does not match format '%Y/%m/%d'
time data '' does not match format '%Y/%m/%d'
为什么这个date_convert函数会执行三次呢?
前几天都没有来得及思考这个问题。今天查看scrapy.loader.processors源代码中的各个方法,发现除了MapCompose外还有Compose,代码读得不是太明白,不过大概意思就是不把value中的值一个一个取出来执行函数,这样我就想到使用此方法会不会可以解决date_convert函数被执行三次的问题呢。因为原来传入date_convert中的参数正是一个长度为三的列表。尝试后发现果然如此。结果为:<class 'list'>: [datetime.date(2018, 9, 4)]。
此外还有Identity方法,不执行任何操作。