简单解决日期格式问题

博主在爬虫项目中需获取新闻发布日期,但很多网站显示‘xx日前’等非完整格式。为此写了小型方法产生标准格式日期,原理是用dateutil库与当前时间做减法、正则匹配数字,同时考虑爬取不同语种网站的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写一个爬虫项目,需要获取很多新闻的发布日期。

但是很多新闻网站的发布时间,不会直接写“xx月xx日xx时xx分”,而是写“xx日前”,“xx分钟前”,“xx秒前”。而我需要获取到完整的日期时间。

于是写了一个小型方法,用于产生标准格式日期。 

原理就是使用deteutil库,和当前时间进行时间减法运算,用正则匹配数字。

注意:如果import dateutil的时候失败,请尝试import python-dateutil

"""
将格式为 xxx日前、xx小时前、xx分钟前
改为标准的 2023-05-17 15:00:00 这样的格式
传入任意包含(xx日前,xx小时前,xx分前)的字符串,返回标准格式字符串
"""

import datetime
import re
from dateutil.relativedelta import relativedelta


def change_datetime(time_str, day='', minute='', hour=''):

    # 该语言的日、时、分称呼
    day = day
    minute = minute
    hour = hour

    number = re.search('([0-9]+)', time_str).group()
    if number == '' or not number:
        raise Exception('该字符串中没有表示时间的数字!')
    number = int(number)

    now_time = datetime.datetime.now()
    now_time_str = str(now_time)[:-7]

    timeArray = datetime.datetime.strptime(now_time_str, "%Y-%m-%d %H:%M:%S")

    if minute != '' and minute in time_str:
        timeArray = timeArray - relativedelta(minutes=number)
    elif hour != '' and hour in time_str:
        timeArray = timeArray - relativedelta(hours=number)
    elif day != '' and day in time_str:
        timeArray = timeArray - relativedelta(days=number)
    else:
        raise Exception('转换失败,可能是该语言的日、时、分填错/未填,或编码问题和依赖问题。')

    return str(timeArray)


if __name__ == '__main__':
    ti = 'Đầu Tư - 2 giờ trước'
    ti2 = 'VietnamNet - 57 phút trước'

    res = change_datetime(ti, hour='giờ', minute='phút')
    print(res)

因为需要爬取各个国家的网站,语言不同,所以别的语种也要考虑到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值