最近在写一个爬虫项目,需要获取很多新闻的发布日期。
但是很多新闻网站的发布时间,不会直接写“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)
因为需要爬取各个国家的网站,语言不同,所以别的语种也要考虑到。