Python minidom读取编码不符XML报错,如何指定编码而非手动修改?
解决minidom解析编码不一致XML文件的问题
这个问题我之前也碰到过,那些“声明编码和实际编码不匹配”的XML文件确实挺头疼的!不用手动修改XML文件的话,有几个优雅的处理方案:
方案1:手动指定正确编码读取文件
既然你已经知道这类文件实际是ISO-8859-1编码,那可以跳过parse()方法的自动编码检测,手动用正确编码读取文件内容,再用parseString()解析字符串:
from xml.dom.minidom import parseString for File in Data['FileList']: # 以实际编码读取文件内容 with open(File, 'r', encoding='ISO-8859-1') as xml_file: xml_content = xml_file.read() # 解析字符串形式的XML dom = parseString(xml_content) # 执行你的后续操作 # do something
方案2:自动检测文件编码(更通用)
如果不确定所有问题文件的实际编码,推荐用chardet库自动检测编码,这样能兼容更多编码不匹配的场景:
首先安装依赖库:
pip install chardet
然后修改脚本:
from xml.dom.minidom import parseString import chardet for File in Data['FileList']: # 先以二进制模式读取原始数据 with open(File, 'rb') as xml_file: raw_data = xml_file.read() # 自动检测编码 detect_result = chardet.detect(raw_data) actual_encoding = detect_result['encoding'] # 用检测到的编码解码为字符串 xml_content = raw_data.decode(actual_encoding) # 解析XML dom = parseString(xml_content) # do something
为什么原来的代码会报错?
minidom.parse()方法会默认根据XML声明里的编码(比如<?xml version="1.0" encoding="UTF-8"?>)去读取文件,但如果文件实际保存的编码和声明不一致(比如实际是ISO-8859-1),就会出现ExpatError错误。而我们先手动用正确编码把文件解码为Unicode字符串,再交给parseString()解析,就绕开了这个编码不匹配的问题。
内容的提问来源于stack exchange,提问作者user3884301
相关产品推荐
相关产品推荐

