使用Python修复Word文档document.xml的&符号解析错误
解决Docx文档因未转义&符号无法打开的自动化方案
由于原生成的document.xml包含未转义的&符号,属于不合法XML,无法用常规XML解析库读取,直接以文本方式修改是最直接的方案。以下是基于Python zipfile模块的实现步骤:
核心思路
绕开XML解析,直接操作Docx压缩包内的document.xml文件:
- 将Docx当作ZIP压缩包处理
- 读取
document.xml文本内容,替换未转义的&为&(避免重复转义已合法的&) - 将修改后的内容写回压缩包
代码实现
import zipfile import re import shutil def fix_docx_ampersand(docx_path, output_path=None): # 备份原文件(可选但建议) if not output_path: output_path = docx_path.replace('.docx', '_fixed.docx') shutil.copyfile(docx_path, output_path) # 打开目标Docx压缩包 with zipfile.ZipFile(output_path, 'a') as zf: # 读取document.xml内容 with zf.open('word/document.xml', 'r') as f: content = f.read().decode('utf-8') # 替换未转义的&:只替换不是&开头的& fixed_content = re.sub(r'&(?!amp;)', r'&', content) # 将修改后的内容写回压缩包(覆盖原文件) zf.writestr('word/document.xml', fixed_content.encode('utf-8')) # 使用示例 fix_docx_ampersand('problematic.docx')
关键细节说明
- 使用
re.sub(r'&(?!amp;)', ...)确保不会把已经正确转义的&再次替换成& - 用
zipfile.ZipFile的a模式(追加/修改模式)打开,直接覆盖原有document.xml - 先复制原文件到输出路径,避免修改过程中损坏原始文档
扩展提示
如果发现Docx内其他XML文件(如footnotes.xml、endnotes.xml)也存在同样问题,只需在代码中添加对应文件路径的处理逻辑即可。
内容的提问来源于stack exchange,提问作者Chris Laffin
相关产品推荐
相关产品推荐

