XML文件如何通过HTTP GET获取 Python requests下载XML

月夜之吻

月夜之吻

2026-03-22

173人浏览

原创

推荐用 et.fromstring(r.content) 直接解析 bytes,它自动识别 xml 声明中的 encoding;若声明缺失或冲突,需手动 decode;大文件用 iterparse 流式处理。

xml文件如何通过http get获取 python requests下载xml

requests.get() 直接获取 XML 内容没问题,但响应体默认是 bytes

Python requests 发起 GET 请求拿到 XML,本质和拿 HTML、JSON 没区别——response.content 是原始字节流,response.text 是解码后的字符串。很多人卡在第一步:用 response.text 解析时报编码错误,比如 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff

  • XML 声明里常带编码(如 <?xml version="1.0" encoding="GBK"?>),但 requests 不会自动按这个解码,它只看 HTTP Content-Type 头里的 charset
  • 如果服务端没返回 charsetresponse.text 默认用 utf-8 解码,而实际是 GB2312ISO-8859-1,就直接崩
  • 稳妥做法是先用 response.content 拿 bytes,再手动按 XML 声明或业务约定解码;或者交给 xml.etree.ElementTree 自己处理(它能识别声明)

用 xml.etree.ElementTree.fromstring() 解析 raw bytes 最省心

别先 decode 再 parse,直接把 response.content 丢给 ET.fromstring() —— 它内部会自动检测 XML 声明里的 encoding 属性,并正确解码。这是最常见也最不容易翻车的方式。

  • ET.fromstring(response.content) 支持 UTF-8、UTF-16、GBK 等主流编码,只要 XML 声明写对了就能认出来
  • 如果 XML 没声明 encoding(不规范但存在),且内容含非 ASCII 字符,fromstring() 可能抛 ParseError;此时得先猜编码,用 response.content.decode('gbk') 得到字符串再传入
  • 注意:不要用 ET.parse() 直接传 URL,它不支持网络路径,只能读本地文件或 file-like object
import requests
import xml.etree.ElementTree as ET
<p>r = requests.get('<a href="https://www.php.cn/link/73693853a57a48e11cdea2a77e88a501">https://www.php.cn/link/73693853a57a48e11cdea2a77e88a501</a>')
r.raise_for_status()  # 别忘了检查 HTTP 状态码
root = ET.fromstring(r.content)  # ✅ 推荐:bytes 直接喂给 fromstring</p>

遇到乱码或解析失败,优先检查 Content-Type 和 XML 声明是否冲突

服务器返回的 Content-Type 头(如 text/xml; charset=ISO-8859-1)和 XML 文件开头的 encoding 声明(如 encoding="UTF-8")打架,是 XML 解析出问题的头号原因。

  • print(r.headers.get('content-type'))print(r.content[:100]) 快速确认两者是否一致
  • 若不一致,以 XML 声明为准(它是 XML 规范强制要求的),忽略 Content-Type 里的 charset
  • 某些老旧系统返回 Content-Type: text/xml 却不带 charset,还用 GBK 编码——这时候必须手动 decode:r.content.decode('gbk')

大 XML 文件别用 .content 全部加载进内存

如果 XML 超过几 MB,response.content 会一次性把整个响应体读进内存,容易 OOM。这时得用流式解析,比如 xml.etree.ElementTree.iterparse() 配合 response.raw

  • response.raw 是未解码的 socket 流,需设 stream=True 才可用:requests.get(url, stream=True)
  • iterparse() 边读边解析,适合处理 <item></item> 这类重复子节点,不用一次性载入整棵树
  • 记得调用 response.raw.close() 或用 with requests.get(..., stream=True) as r: 确保连接释放
r = requests.get('https://example.com/big.xml', stream=True)
r.raise_for_status()
for event, elem in ET.iterparse(r.raw, events=('start', 'end')):
    if event == 'end' and elem.tag == 'record':
        print(elem.find('title').text)
        elem.clear()  # ⚠️ 关键:清空已处理节点,防内存堆积

XML 的坑不在“怎么下”,而在“怎么不崩”。真正麻烦的永远是编码混乱、声明缺失、服务端瞎配 Content-Type——这些没法靠换库解决,得一层层 inspect 响应头和原始字节。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1530

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1377

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

585

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1265

7

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

1121

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

125

24

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

2758

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

3316

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

1772

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习