Python處理剛剛,分鐘,小時,天前等時間

簡介

用爬蟲獲取目標網站數據後可能會遇見時間為處理剛剛,分鐘,小時,天前等時間格式,如圖

解決問題:

寫了一個工具類來處理該問題,其中封裝了兩個函數

1. 將時間中的中文數字轉換成阿拉伯數字

    def exchange_num(date):
        '''
        將輸入字元串中的中文數字轉換成阿拉伯數字
        '''
        zh_num = '零一二三四五六七八九'
        for num in range(len(zh_num)):
            date = date.replace(zh_num[num], str(num))
        return date

2.將時間按照剛剛,分鐘,小時,天前等時間格式進行判定跟轉換對應時間

    def deal_time(zh_time):
        '''
        對時間進行分類處理,對不同情況進行判斷
        '''
        zh_time = exchange_num(zh_time.strip())
        time_list = [
            "小時前",
            "分鐘前",
            "剛剛",
            "天前"
        ]
        now_time = datetime.strftime(datetime.today(), '%Y-%m-%d')
        time_key_dict = {}
        [time_key_dict.update({key: operator.contains(zh_time, key)}) for key in time_list]
        if time_key_dict['剛剛'] or time_key_dict['分鐘前']:
            return now_time
        elif time_key_dict['小時前']:
            now_hour = datetime.strftime(datetime.today(), "%H")
            pattern = re.search(r"(\d+)", zh_time)
            if pattern.group(1) <= now_hour:
                # 小於24小時轉換成當日時間
                return now_time
            else:
                return datetime.strftime(datetime.today() + timedelta(days=-1), '%Y-%m-%d')  # 獲取前1天日期

        elif time_key_dict['天前']:
            try:
                pattern = re.search(r"(\d+)", zh_time)
                zh_time = datetime.strftime(datetime.today() + timedelta(days=(int(pattern.group(1))) * -1),'%Y-%m-%d')
                return zh_time
            except Exception:
                return f"轉換失敗 當前時間{now_time},網站中的時間{zh_time}"
        else:
            return zh_time

完整程式碼如下

import operator
from datetime import datetime, timedelta
import re


class DealTime:
    '''
    處理剛剛,分鐘,小時,天前等時間
    '''

    def exchange_num(self, date):
        '''
        將輸入字元串中的中文數字轉換成阿拉伯數字
        '''
        zh_num = '零一二三四五六七八九'
        for num in range(len(zh_num)):
            date = date.replace(zh_num[num], str(num))
        return date

    def deal_time(self, zh_time):
        '''
        對時間進行分類處理,對不同情況進行判斷
        '''
        zh_time = self.exchange_num(zh_time.strip())
        time_list = [
            "小時前",
            "分鐘前",
            "剛剛",
            "天前"
        ]
        now_time = datetime.strftime(datetime.today(), '%Y-%m-%d')
        time_key_dict = {}
        [time_key_dict.update({key: operator.contains(zh_time, key)}) for key in time_list]
        if time_key_dict['剛剛'] or time_key_dict['分鐘前']:
            return now_time
        elif time_key_dict['小時前']:
            now_hour = datetime.strftime(datetime.today(), "%H")
            pattern = re.search(r"(\d+)", zh_time)
            if pattern.group(1) <= now_hour:
                # 小於24小時轉換成當日時間
                return now_time
            else:
                return datetime.strftime(datetime.today() + timedelta(days=-1), '%Y-%m-%d')  # 獲取前1天日期

        elif time_key_dict['天前']:
            try:
                pattern = re.search(r"(\d+)", zh_time)
                zh_time = datetime.strftime(datetime.today() + timedelta(days=(int(pattern.group(1))) * -1), '%Y-%m-%d')
                return zh_time
            except Exception:
                return f"轉換失敗 當前時間{now_time},網站中的時間{zh_time}"
        else:
            return zh_time


if __name__ == '__main__':
    print(DealTime().deal_time("剛剛"))
    print(DealTime().deal_time("一天前"))
    print(DealTime().deal_time("1天前"))
    print(DealTime().deal_time("5分鐘前"))