如何解析提取被HTML标签污染的任意格式日期
被HTML标签污染的日期解析方案
核心处理思路
- 第一步:预处理清除HTML标记
所有穿插的HTML标签属于无效干扰信息,直接通过正则全局匹配移除即可,不需要额外保留标签内容。处理时额外做空白符归一化,把多个连续空格、换行、制表符统一替换为单个空格,避免空格干扰后续日期解析。
import re def clean_html(raw_text: str) -> str: # 移除所有HTML标签 no_tag_text = re.sub(r'<[^>]+>', '', raw_text) # 归一化空白符 return re.sub(r'\s+', ' ', no_tag_text).strip()
对示例输入<tag> Aug 22, <tag> 2021执行上述方法后,输出为Aug 22, 2021。
- 第二步:通用日期解析与格式化
不要手动编写正则匹配各类日期格式,直接使用成熟的第三方日期解析库即可,这类库内置了几十种常见日期格式的匹配规则,支持月名缩写/全写、不同分隔符、年月日不同排序等场景的自动识别。
以Python生态的dateutil库为例:
from dateutil import parser from datetime import datetime def parse_and_format_date(clean_text: str, target_format: str = "%d %B %Y") -> str: # 自动识别解析日期,可根据业务需求添加参数调整歧义场景的解析优先级 # 比如添加dayfirst=True来优先解析为 日/月/年 格式 date_obj = parser.parse(clean_text) return date_obj.strftime(target_format)
对上一步输出的Aug 22, 2021执行上述方法后,输出为22 August 2021,和示例要求完全匹配。
边界场景处理注意事项
- 如果清理后的文本内存在多个日期,可通过
parser.parse的fuzzy_with_tokens参数提取所有匹配的日期片段,再根据业务规则筛选需要的目标日期 - 遇到存在歧义的日期格式(如
05/10/2023),可通过dayfirst、yearfirst参数指定解析优先级,避免解析结果不符合预期 - 如果业务场景存在罕见的自定义日期格式,可给
parser.parse传入dateutil.parser.parserinfo对象补充自定义的月名、周名匹配规则
内容的提问来源于stack exchange,提问作者matheus james
相关产品推荐
相关产品推荐

