如何使用Python从XML格式URL中下载file_type为DLTINS的目标文件
你已有的代码已经完成了接口请求和XML根节点解析,接下来补全节点匹配、提取下载链接、下载文件的逻辑即可,完整可运行代码如下:
import requests import xml.etree.ElementTree as ET # 请求文件列表接口 list_url = "https://registers.esma.europa.eu/solr/esma_registers_firds_files/select?q=*&fq=publication_date:%5B2021-01-17T00:00:00Z+TO+2021-01-19T23:59:59Z%5D&wt=xml&indent=true&start=0&rows=100" response = requests.get(list_url, timeout=30) response.raise_for_status() # 自动校验请求是否成功,遇到4xx/5xx直接抛出异常 root = ET.fromstring(response.text) target_download_url = None # 遍历所有文件记录节点,匹配第一个DLTINS类型的文件 for doc_node in root.findall(".//doc"): current_file_type = "" current_download_link = "" # 遍历当前记录下的所有字段 for str_node in doc_node.findall("str"): field_name = str_node.attrib.get("name") if field_name == "file_type" and str_node.text: current_file_type = str_node.text.strip() elif field_name == "download_link" and str_node.text: current_download_link = str_node.text.strip() # 匹配到目标类型就跳出循环 if current_file_type == "DLTINS" and current_download_link: target_download_url = current_download_link break if not target_download_url: print("未找到符合要求的DLTINS类型文件") else: # 下载目标文件 print(f"匹配到目标文件,下载地址:{target_download_url}") file_resp = requests.get(target_download_url, timeout=120, stream=True) file_resp.raise_for_status() # 取链接末尾段作为保存文件名,也可自定义文件名 save_name = target_download_url.split("/")[-1] # 分块写入避免大文件占用过多内存 with open(save_name, "wb") as f: for chunk in file_resp.iter_content(chunk_size=8192): f.write(chunk) print(f"文件已保存为:{save_name}")
核心逻辑说明
- 接口返回的XML结构中,所有文件记录都存放在
<doc>节点下,每个<doc>下的<str>节点通过name属性区分字段类型,我们需要匹配file_type为DLTINS的记录,提取对应的download_link字段值 - 下载环节启用流式传输分块写入,适配该接口返回的大体积压缩包文件,减少内存占用
内容的提问来源于stack exchange,提问作者Maws
相关产品推荐
相关产品推荐

