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

Python打开XML文件报错:字符间存在NULL(\x00)字符该如何解决

问题根本原因

该问题完全由编码不匹配导致:你拿到的XML文件是UTF-16编码(通常为Windows平台常用的小端序UTF-16LE),这种编码格式下,每个字符固定占用2字节存储,对于ASCII范围内的字符,第二个字节固定为\x00(NULL字符)。
你调用open()读取文件时没有指定编码,Python会默认使用系统默认编码(Windows通常为GBK,类Unix系统通常为UTF-8)解析文件,将原本属于同一个字符的2字节拆分为两个独立字符,最终就出现了有效字符之间夹带NULL字符的现象。普通文本编辑器会自动检测文件编码,因此可以正常显示内容。
你目前使用的替换NULL字符的方案仅对纯ASCII内容的文件有效,如果文件中出现中文、特殊符号等非ASCII字符,就会出现不可逆的乱码,不建议长期使用。

正确读取方案

方案1:直接指定编码读取(最推荐)

读取文件时直接指定编码为utf-16,Python会自动完成编码转换,不需要手动处理字符,兼容性最好:

from bs4 import BeautifulSoup
file = 'sample.xml'
# 直接指定UTF-16编码读取
with open(file, 'r', encoding='utf-16') as f:
    data = f.read()
Bs_data = BeautifulSoup(data, 'xml')

如果指定utf-16时报错,大概率是文件没有带BOM头,可根据实际编码尝试替换为utf-16-le(小端序)或者utf-16-be(大端序)即可。

方案2:自动检测编码后读取

如果不确定文件的实际编码,可以先读取二进制内容,检测编码后再解码:

from bs4 import BeautifulSoup
import chardet

file = 'sample.xml'
# 先读取二进制内容
with open(file, 'rb') as f:
    raw_data = f.read()
# 自动检测编码
detect_res = chardet.detect(raw_data)
encoding = detect_res['encoding']
# 解码后解析
data = raw_data.decode(encoding)
Bs_data = BeautifulSoup(data, 'xml')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:04