Python日期格式匹配不符合预期的问题排查与解决
问题分析与修复方案
嘿,我一眼就看出你的问题所在了——你的check_url_datefmt函数逻辑完全走偏啦!
核心错误原因
你现在的代码是把实际爬取到的日期字符串和格式模板字符串直接做相等比较,比如拿"Submitted Jan 3rd 2018 11:03 PM by"和"Submitted %b %dst %Y %I:%M %p by"去比,这两个字符串根本不可能相等啊!所以前三个if/elif分支永远不会触发,不管传入什么日期,最后都会走到else返回带th的格式,自然就会出现你遇到的ValueError——因为3rd和格式里的%dth不匹配嘛。
两种修复方案
方案1:先移除日期后缀(最简洁高效)
其实完全不用去判断后缀,我们可以先用正则把日期里的st/nd/rd/th这些后缀直接去掉,然后用统一的格式解析就行。这样连check_url_datefmt函数都可以省掉:
import re from datetime import datetime def compare_date(date1, date2): # 用正则替换掉数字后面的st/nd/rd/th后缀 cleaned_web_date = re.sub(r'(\d+)(st|nd|rd|th)', r'\1', date1) # 用统一的格式解析处理后的日期 date_tm_obj_url = datetime.strptime(cleaned_web_date, 'Submitted %b %d %Y %I:%M %p by') date_tm_obj_usr = datetime.strptime(date2, '%b %d %Y %I:%M %p') return date_tm_obj_url > date_tm_obj_usr
方案2:修正格式匹配逻辑(保留你的原思路)
如果你还是想保留通过匹配格式来处理的思路,那应该改成用每个格式模板尝试解析日期字符串,而不是直接对比字符串。修改后的check_url_datefmt函数如下:
from datetime import datetime def check_url_datefmt(date): fmt_lst = [ 'Submitted %b %dst %Y %I:%M %p by', 'Submitted %b %dnd %Y %I:%M %p by', 'Submitted %b %drd %Y %I:%M %p by', 'Submitted %b %dth %Y %I:%M %p by' ] # 逐个尝试格式模板,能成功解析的就是正确格式 for fmt in fmt_lst: try: datetime.strptime(date, fmt) return fmt except ValueError: # 解析失败,继续试下一个 continue # 如果所有格式都不行,抛出异常提示 raise ValueError(f"无法匹配日期格式:{date}") def compare_date(date1, date2): date_tm_obj_url = datetime.strptime(date1, check_url_datefmt(date1)) date_tm_obj_usr = datetime.strptime(date2, '%b %d %Y %I:%M %p') return date_tm_obj_url > date_tm_obj_usr
验证一下
比如传入"Submitted Jan 3rd 2018 11:03 PM by",方案1会把它处理成"Submitted Jan 3 2018 11:03 PM by",然后用统一格式解析;方案2会尝试第三个格式模板,成功解析后返回对应的格式,这样就不会报错啦。
内容的提问来源于stack exchange,提问作者dig_123
相关产品推荐
相关产品推荐

