.docx文件本质是遵循ooxml标准的zip压缩包,含document.xml(正文)、styles.xml(样式)等核心xml部件;推荐用python-docx等库安全提取文本,避免手动解析xml导致的样式继承、编号还原、特殊字符等问题。

Word的.docx文件本质上是ZIP压缩包,里面包含多个XML文件和资源,读取内容的关键是解压并解析其中的document.xml(主文档内容)和styles.xml(样式信息)等核心部件。
理解.docx的内部结构
.docx不是二进制黑盒,而是遵循Office Open XML(OOXML)标准的ZIP归档。用任意解压工具(如7-Zip、WinRAR)重命名.docx为.zip后打开,能看到如下关键路径:
- word/document.xml —— 存放正文文字、段落、换行、简单内联格式(如加粗、斜体)
- word/styles.xml —— 定义标题样式、正文样式、自定义样式名及对应格式
- word/numbering.xml 和 word/styles.xml —— 联合决定编号/项目符号逻辑
- word/media/ —— 图片等嵌入对象(按名称引用,不直接存于document.xml)
- [Content_Types].xml —— 声明各部件类型,帮助程序识别哪些是文档主体
用Python安全读取文本内容(推荐方式)
不建议手动解压+解析XML——容易漏掉样式继承、编号还原、特殊字符(如软回车、分节符)、注释、页眉页脚等。更稳妥的做法是用成熟库:
- python-docx:专注读写.docx,自动处理document.xml + styles.xml + numbering.xml联动,返回段落、运行(Run)、表格等对象
- docx2python:将.docx按“节→段落→运行→文本+样式”逐层拆解为Python原生数据结构(dict/list),适合需要精细控制样式提取的场景
- lxml + zipfile:仅在需深度定制(如只提取某类标签、修复损坏文件)时使用,需自行处理命名空间、关系映射、样式继承
示例(python-docx):
from docx import Document
doc = Document("example.docx")
for para in doc.paragraphs:
print(para.text) # 自动合并同一段内所有Run的文本
for run in para.runs:
if run.bold:
print(" → 加粗:", run.text)
手动解析document.xml的注意事项
如果坚持用XML解析(如用lxml或xml.etree.ElementTree),必须注意:
- XML有严格命名空间:
http://schemas.openxmlformats.org/wordprocessingml/2006/main,查询元素时要带ns前缀,例如{http://...}p表示段落 - 文本分散在
w:t(纯文本)、w:tab、w:br(换行)、w:cr(软回车)中,需按顺序拼接 - 格式信息在
w:rPr(运行属性)下,如w:b表示加粗,但实际是否生效取决于样式继承链,不能孤立判断 - 超链接、脚注、域代码(如TOC、页码)都以特殊XML结构存在,
w:t里可能为空,内容藏在别处
为什么直接读XML容易出错
因为Word的渲染逻辑远比XML结构复杂:
- 一个“标题1”段落的字体大小,可能来自样式定义 + 用户手动覆盖 + 模板默认值,XML里只存差异部分
- 列表编号由
numbering.xml中的抽象ID +document.xml中引用 +styles.xml中编号样式共同决定 - 中文换行、全角空格、零宽字符、域结果(如“第1页”)在
w:t中不可见,需额外解析w:fldChar等节点 - 修订模式(Track Changes)下的删除/插入内容,在XML中有专门标记,普通文本提取会跳过或混淆
基本上就这些。想稳定提取可读文本,优先用python-docx;真要碰XML,先解压看一眼结构,再带着命名空间和OOXML规范查文档。










