使用pd.read_xml读取含变音特殊字符标签的XML文件报错求助
问题说明
使用pandas的read_xml()方法读取标签中包含变音符号(Umlauts)的XML文件时持续触发解析报错,不希望通过全局替换文件内变音符号的方式解决问题。
复现代码
import io import pandas as pd f = io.StringIO("""<?xml version="1.0" encoding="UTF-8"?> <!--Erzeugt durch 4D Anwendung--> <Root> <r1_Belegzeile> <ID>65377</ID> <Belegtext>ABCABCABC</Belegtext> <Belegkürzel>ABC</Belegkürzel> </r1_Belegzeile> <r1_Belegzeile> <ID>65377</ID> <Belegtext>EFGEFGEFG</Belegtext> <Belegkürzel>EFG</Belegkürzel> </r1_Belegzeile> </Root> """) df = pd.read_xml(f)
已尝试操作与报错
- 直接运行上述代码抛出错误:
XMLSyntaxError: error parsing attribute name, line 5, column 12 - 为
read_xml添加encoding="ISO-8859-1"参数,问题未解决 - 更换解析器为
parser="etree",报错变更为ParseError: not well-formed (invalid token): line 5, column 11 - 已确认报错触发点为标签
<Belegkürzel>中的变音字符ü
解决方法
报错核心原因是StringIO承载的是Unicode字符串,XML解析器处理这类流时不会读取头部的编码声明,默认按ASCII规则校验标签名,遇到非ASCII的变音字符就会判定为非法标记。不需要修改原文件内容,按以下方式调整即可:
方案1:转UTF-8字节流读取
将XML内容编码为UTF-8格式的字节流,用BytesIO承载后传入read_xml,显式指定编码即可正常解析:
import io import pandas as pd xml_content = """<?xml version="1.0" encoding="UTF-8"?> <!--Erzeugt durch 4D Anwendung--> <Root> <r1_Belegzeile> <ID>65377</ID> <Belegtext>ABCABCABC</Belegtext> <Belegkürzel>ABC</Belegkürzel> </r1_Belegzeile> <r1_Belegzeile> <ID>65377</ID> <Belegtext>EFGEFGEFG</Belegtext> <Belegkürzel>EFG</Belegkürzel> </r1_Belegzeile> </Root> """ # 转为UTF-8字节流 f = io.BytesIO(xml_content.encode("utf-8")) df = pd.read_xml(f, encoding="utf-8")
如果是读取本地XML文件,直接传入文件路径即可,不要用StringIO转存字符串:
df = pd.read_xml("your_file_path.xml", encoding="utf-8")
方案2:开启lxml解析容错模式
如果源文件存在部分不符合XML严格规范的写法,可自定义lxml解析器开启恢复模式,兼容非标准标签:
import io import pandas as pd from lxml import etree xml_content = """<?xml version="1.0" encoding="UTF-8"?> <!--Erzeugt durch 4D Anwendung--> <Root> <r1_Belegzeile> <ID>65377</ID> <Belegtext>ABCABCABC</Belegtext> <Belegkürzel>ABC</Belegkürzel> </r1_Belegzeile> <r1_Belegzeile> <ID>65377</ID> <Belegtext>EFGEFGEFG</Belegtext> <Belegkürzel>EFG</Belegkürzel> </r1_Belegzeile> </Root> """ f = io.BytesIO(xml_content.encode("utf-8")) # 配置解析器开启容错,指定编码 custom_parser = etree.XMLParser(recover=True, encoding="utf-8") df = pd.read_xml(f, parser=custom_parser, encoding="utf-8")
内容的提问来源于stack exchange,提问作者divingTobi
相关产品推荐
相关产品推荐

