首页 新闻 搜索 专区 学院

scrapy item_loader使用出现的问题

0
悬赏园豆:10 [已解决问题] 解决于 2018-09-22 11:15

我有一项值无论怎么处理,始终都是列表无法提取第一个。

因为提取的日期值后面会有一个点: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函数会执行三次呢?

从MH到其他的主页 从MH到其他 | 初学一级 | 园豆:140
提问于:2018-09-17 23:06
< >
分享
最佳答案
0

前几天都没有来得及思考这个问题。今天查看scrapy.loader.processors源代码中的各个方法,发现除了MapCompose外还有Compose,代码读得不是太明白,不过大概意思就是不把value中的值一个一个取出来执行函数,这样我就想到使用此方法会不会可以解决date_convert函数被执行三次的问题呢。因为原来传入date_convert中的参数正是一个长度为三的列表。尝试后发现果然如此。结果为:<class 'list'>: [datetime.date(2018, 9, 4)]。

此外还有Identity方法,不执行任何操作。

从MH到其他 | 初学一级 |园豆:140 | 2018-09-22 11:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册