Python Selenium如何校验数组内日期是否在近365/90天范围内
日期区间校验实现方案
核心实现逻辑
要实现每日自动执行的日期区间合规校验,核心是动态计算当日对应的时间阈值,再批量判定爬取到的日期归属区间,需要重点关注三个要点:
- 时区统一:必须和业务日期使用相同时区,避免跨时区导致的日期偏移,脚本每日自动执行时,时区不一致会直接导致校验结果出错
- 边界兼容:计算回溯区间时以当日零点作为时间上界,既不会漏算当日数据,也不会把页面错误显示的未来时间误判为合规
- 异常捕获:页面爬取的日期字符串可能存在格式异常,增加解析错误标记,避免脚本意外中断,也方便排查页面结构变动问题
另外原代码存在一处逻辑问题:data.sort_values(by='Date') 没有接收返回值也没开启inplace修改,实际排序结果不会生效,修正版本已修复该问题。
完整可运行代码
import pandas as pd from datetime import datetime from selenium.webdriver.common.by import By # 注:FrameworkResult为项目内已定义的返回结构类,保持原有引入逻辑即可 def check_date_in_valid_range(self): # 1. 抓取页面所有日期元素,过滤空文本 elements = self.driver.find_elements(By.XPATH, '//span[@class="date-content"]') date_text_list = [e.text.strip() for e in elements if e.text.strip()] # 2. 构建数据表,统一转换日期格式,解析失败的内容标记为空值 data = pd.DataFrame({'raw_date_text': date_text_list}) data['parsed_date'] = pd.to_datetime(data['raw_date_text'], errors='coerce') # 3. 动态计算当日校验阈值(每日执行时自动更新,无需手动修改) today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) threshold_90d = today - pd.Timedelta(days=90) threshold_365d = today - pd.Timedelta(days=365) # 4. 按日期倒序排序 data = data.sort_values(by='parsed_date', ascending=False).reset_index(drop=True) # 5. 批量打标校验结果 data['is_in_last_90d'] = (data['parsed_date'] >= threshold_90d) & (data['parsed_date'] <= today) data['is_in_last_365d'] = (data['parsed_date'] >= threshold_365d) & (data['parsed_date'] <= today) data['is_parse_failed'] = data['parsed_date'].isna() # 6. 控制台输出校验统计结果 print("=== 日期区间校验结果 ===") print(f"校验基准日:{today.date()}") print(f"近90天合法区间:{threshold_90d.date()} ~ {today.date()}") print(f"近365天合法区间:{threshold_365d.date()} ~ {today.date()}") print(f"总抓取条目数:{len(data)}") print(f"日期格式解析失败条目数:{data['is_parse_failed'].sum()}") print(f"近90天合规条目数:{data['is_in_last_90d'].sum()}") print(f"近365天合规条目数:{data['is_in_last_365d'].sum()}") # 输出异常条目明细 invalid_items = data[(~data['is_in_last_365d']) | (data['is_parse_failed'])] if not invalid_items.empty: print("异常条目明细:") print(invalid_items[['raw_date_text', 'parsed_date', 'is_parse_failed']]) return FrameworkResult( status=0, data={ "check_base_date": today, "threshold_90d": threshold_90d, "threshold_365d": threshold_365d, "check_detail": data.to_dict('records'), "invalid_item_count": len(invalid_items) } )
适配调整提示
- 如果业务使用非本地时区(比如海外站点时区),将
datetime.now()替换为对应时区的时间获取逻辑即可,可通过Python标准库zoneinfo或第三方库pytz指定时区,避免跨天场景下的判定错误 - 如果页面日期存在特殊格式(比如带“昨天”“1周前”这类相对时间文本),需要先做文本转标准日期的预处理,再传入
pd.to_datetime做解析 - 可根据自身业务需要调整校验规则,比如仅校验标注为“近365天”的条目是否真的落在365天区间内,在打标逻辑前增加条目标签的关联判断即可
内容的提问来源于stack exchange,提问作者Tetiana
相关产品推荐
相关产品推荐

