Python ElementTree解析XML报not well-formed无效令牌错误求助
错误根因
ET.fromstring() 方法的作用是直接解析传入的字符串为XML结构,它不会自动读取路径对应的文件内容。你代码里把文件路径字符串(比如blogs/1000331.female.37.indUnk.Leo.xml)直接传给了这个方法,解析器会把路径字符串本身当成XML内容校验:合法XML的开头必须是<(标签起始)或<?(XML声明),而你传入的字符串开头是普通字符b,解析到第5列时就判定不符合XML语法,抛出格式错误。
另外你给解析器设置的encoding="unicode_escape"属于错误配置,该编码仅用于处理转义格式的Unicode字符串,不适合常规XML文件解析。
修复代码
直接用ET.parse()方法传入文件路径即可,这个方法会自动读取、解析路径对应的XML文件:
from xml.etree import ElementTree as ET from os import path, listdir path__ = "blogs/" files = [path.join(path__, f) for f in listdir(path__) if f.endswith('.xml')] for file in files: print(file) tree = ET.parse(file) root = tree.getroot() # 在此处添加你的XML节点处理逻辑
兼容特殊编码文件的方案
如果个别文件存在编码不规范导致解析报错,可以手动指定编码读取文件内容后再解析:
from xml.etree import ElementTree as ET from os import path, listdir path__ = "blogs/" files = [path.join(path__, f) for f in listdir(path__) if f.endswith('.xml')] for file in files: print(file) # 可根据文件实际编码修改encoding参数,errors='ignore'会跳过无法解码的异常字符 with open(file, 'r', encoding='utf-8', errors='ignore') as f: xml_content = f.read() root = ET.fromstring(xml_content) # 在此处添加你的XML节点处理逻辑
提示:批量解析第三方来源的XML文件时,建议增加异常捕获逻辑,避免单个损坏文件中断整个批量处理流程。
内容的提问来源于stack exchange,提问作者skeeper
相关产品推荐
相关产品推荐

