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
相关产品推荐
相关产品推荐

