You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python REST保存解析XML文档时遭遇编码错误求助

解决Python 2.7中ElementTree解析XML的UnicodeEncodeError问题

这是Python 2.7里Unicode处理的典型坑——当你对已经是unicode类型的字符串调用decode('utf-8')时,Python会先尝试用默认的ascii编码把它转成str类型,再执行解码,这就触发了UnicodeEncodeError,因为你的响应文本里包含非ASCII字符。

问题根源分析

在Python 2.7的requests库中,response.text已经是unicode类型了(requests会自动根据响应头的编码把字节转成unicode)。此时调用.decode('utf-8')相当于先执行response.text.encode('ascii').decode('utf-8'),而ascii编码无法处理那些非ASCII字符,所以直接报错。

解决方案:直接使用原始响应字节

最稳妥的方式是跳过response.text,直接用response.content——它是原始的字节流(在Python 2.7中就是str类型),ElementTree可以直接解析,不需要额外的编码处理:

import xml.etree.ElementTree as ET

def getXml(response, objNm):
    # 用response.content获取原始字节,避免编码转换的坑
    root = ET.fromstring(response.content)
    tree = ET.ElementTree(root)
    xmlNm = objNm + ".xml"
    # 写入时指定utf-8编码并添加XML声明,确保文件编码正确
    tree.write(xmlNm, encoding='utf-8', xml_declaration=True)
    print('Object {} was successfully created.'.format(xmlNm))

为什么这个方法有效?

  • response.content是服务器返回的原始数据,没有经过requests的编码转换,ElementTree可以直接解析这种字节流。
  • 写入文件时指定encoding='utf-8'和xml_declaration=True,会在生成的XML文件开头加上<?xml version='1.0' encoding='utf-8'?>,确保后续读取时能正确识别编码,避免乱码。

备选方案:正确处理unicode字符串

如果你一定要使用response.text,可以先把它编码成utf-8的str类型再解析:

root = ET.fromstring(response.text.encode('utf-8'))

不过这种方式不如直接用response.content简洁,毕竟多了一步编码转换。

内容的提问来源于stack exchange,提问作者JanFi86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:10:26