如何使用Python ElementTree替换日期字符串并解析XML数据
实现方案
前置准备
需要先安装网络请求库requests,执行命令:
pip install requests
完整可运行代码
from datetime import datetime, timedelta import requests import xml.etree.ElementTree as ET # 1. 生成今日、昨日的格式化日期 today = datetime.today().strftime("%m/%d/%Y") yesterday = (datetime.today() - timedelta(days=1)).strftime("%m/%d/%Y") # 原始URL模板 URL_TEMPLATE = "https://www.mywesbite.com/report/%5B10/01/2021%22%7D" def get_valid_report(): # 按优先级先试今日、再试昨日 for check_date in [today, yesterday]: # 替换URL中的日期(注意原模板里的日期是带前导零的10/01/2021,要替换完整) request_url = URL_TEMPLATE.replace("10/01/2021", check_date) try: # 发送请求,设置超时避免长时间卡住 resp = requests.get(request_url, timeout=10) resp.raise_for_status() # 状态码非200时直接抛异常,进入下一个日期的尝试 # 解析XML root = ET.fromstring(resp.content) # 查找record节点的report_date属性 record_node = root.find(".//record") if not record_node: continue xml_report_date = record_node.get("report_date") # 校验日期是否匹配 if xml_report_date == check_date: print(f"成功获取{check_date}的报告,开始解析") # 这里写你后续解析报告的逻辑 return root except Exception as e: # 出现任何错误(请求失败、解析失败、日期不匹配)都尝试下一个日期 print(f"获取{check_date}报告失败:{str(e)},尝试下一个日期") continue print("今日和昨日的报告都无法获取") return None # 执行获取逻辑 report_root = get_valid_report() if report_root: # 后续解析XML的逻辑可以写在这里 pass
逻辑说明
- 修正了你原有代码的两个问题:一是未导入datetime模块就使用,二是替换URL时用的
10/1/2021和模板里的10/01/2021不匹配,会导致替换失效 - 按优先级先尝试请求今日日期的报告,自动校验返回XML内的report_date字段,匹配就直接返回XML对象供后续解析
- 今日报告请求失败、解析出错、日期不匹配时,自动降级请求昨日的报告
- 加入了异常捕获,不会因为单次请求/解析错误导致程序直接崩溃
内容的提问来源于stack exchange,提问作者biggboss2019
相关产品推荐
相关产品推荐

