当前位置: 首页 > news >正文

DOCX本质

一、DOCX 本质是 ZIP

.docx 不是单一二进制文件,而是 Office Open XML(OOXML) 格式:一个改了扩展名的 ZIP 压缩包。

.docx 改成 .zip 再解压,或直接当 ZIP 读,会看到类似结构:

需要提取变量.docx (ZIP)
├── [Content_Types].xml # 各文件的类型说明
├── _rels/.rels # 包级关系
├── docProps/ # 文档属性(作者、创建时间等)
│ ├── app.xml
│ └── core.xml
└── word/ # Word 正文相关
├── document.xml # ★ 正文内容(文字、段落、图片引用)
├── document.xml.rels # 正文里图片等资源的关系
├── media/ # ★ 嵌入的图片
│ ├── image1.png
│ ├── image2.png
│ └── ...
├── styles.xml # 样式
└── settings.xml # 设置

和 Word 界面的对应关系:

你在 Word 里看到的ZIP 里实际存放的位置
文字段落
word/document.xml
插入的图片
word/media/image1.png
图片在文档中的位置
document.xml<w:drawing> 引用图片

所以 Python 可以这样读,不需要安装 Word:

import zipfile
with zipfile.ZipFile("需要提取变量.docx") as zf:
xml = zf.read("word/document.xml") # 读正文
img = zf.read("word/media/image1.png") # 读图片

二、正文在 word/document.xml

Word 不会把“一整段纯文本”存进去,而是用 XML 树 描述文档结构。

你文档里第一段文字,在 XML 里大致是这样(已格式化便于阅读):

<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p> <!-- p = paragraph 段落 -->
<w:r> <!-- r = run 一段连续文字 -->
<w:t>年均职工人数</w:t> <!-- t = text 实际文字 -->
</w:r>
<w:r>
<w:t> qt_npjzgs f435</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>年初职工人数 qt_nczgs f436 f391</w:t>
</w:r>
</w:p>
...
<w:p>
<w:r>
<w:drawing>...</w:drawing> <!-- 图片,不是文字 -->
</w:r>
</w:p>
</w:body>
</w:document>

层级关系:

document(文档)
└── body(正文区)
└── p(段落)
└── r(文字块,可设不同字体/颜色)
└── t(真正显示的文本)

对你这份文档的意义:

  • 前半部分变量(如 qt_npjzgsf435)在 <w:t> 里 → 可以直接用代码提取
  • 后半部分变量在截图里 → XML 里只有 <w:drawing> 指向 image1.png 等 → 必须读图片或 OCR

脚本里的提取逻辑就是遍历所有 w:t 节点:

for node in root.iter(f"{W_NS}t"):
if node.text:
parts.append(node.text)

三、XML 命名空间是什么?

问题从哪来?

XML 里标签名可以重复。比如:

  • Word 用 <p> 表示段落
  • 别的标准也可能用 <p> 表示别的含义

如果混在一起,解析器无法区分。

解决办法:命名空间(Namespace)

给每套标准一个 全球唯一的 ID,标签写成 前缀:标签名,前缀在文件开头绑定到某个 URI:

xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"

含义是:

  • 前缀 w → 绑定到 Word 主命名空间
  • <w:p> = Word 的段落
  • <w:t> = Word 的文本
  • <wp:inline> = 另一个命名空间(Drawing,用于图片布局)

你文件开头实际声明了多个命名空间:

前缀用途
w
Word 正文(段落、文字)
wp
图片在页面上的位置
pic
图片本身
r
资源关系(如图片 ID 对应哪个 png)

为什么 URI 长得像网址?

http://schemas.openxmlformats.org/... 只是唯一标识符,不是要去访问的网址。
可以把它理解成“这套标签的身份证号”,不会联网。

Python 里为什么要写 W_NS

ElementTree 解析 XML 时,标签名是 带命名空间的完整名,不是简单的 t,而是:

{http://schemas.openxmlformats.org/wordprocessingml/2006/main}t

所以代码里写:

W_NS = "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}"
root.iter(f"{W_NS}t") # 查找所有 w:t 文本节点

如果写成 root.iter("t"),会找不到任何节点,因为实际标签名不是 t


四、整体流程串起来

需要提取变量.docx
▼ zipfile 解压
┌───────────────────┐
│ word/document.xml │ ──► 解析 XML ──► 找 w:t ──► 正则提取变量名
└───────────────────┘ (W_NS + t)
┌───────────────────┐
│ word/media/*.png │ ──► 图片里的变量名(需 OCR 或人工核对)
└───────────────────┘
variables.txt(105 个变量)

五、一句话总结

概念含义
DOCX = ZIP
文档是多个 XML + 图片等文件的压缩包
document.xml
存段落、文字、图片引用,是正文的核心
w:t
真正可见的文字内容
XML 命名空间
区分不同标准的标签,避免重名;http://... 只是 ID,不联网
W_NS
Python 查找 w:t 时必须用的完整命名空间前缀

如果你愿意,我可以再单独讲 document.xml.relsrId4 如何对应到 image1.png 这条引用链。

http://www.rkmt.cn/news/1525089.html

相关文章:

  • 2026年安徽中考没考上高中怎么办?合肥理工学校值得关注 - 我叫小周
  • ComfyUI-LTXVideo:专业级AI视频生成的技术架构与实战优化指南
  • Awesome-Dify-Workflow终极指南:快速构建AI工作流的完整教程
  • 2026 义乌注册公司推荐榜|第三方实测:口碑好、合规稳、效率高 - 速递信息
  • java数字电路模拟4-6作业集blog总结
  • 天津水电维修服务推荐、2026正规水电维修公司上门收费标准 - 我叫一
  • 终极指南:三步搞定老Mac升级最新macOS系统,让旧设备重获新生
  • 3000+戴森球计划蓝图库:让工厂设计从痛苦到享受的转变指南
  • 如何高效使用HashCheck:Windows文件校验加速工具的专业指南
  • 如何用SillyTavern创建栩栩如生的AI角色:从新手到专家的完整指南
  • 别再傻傻分不清!服务器网卡选型避坑指南:从PCIe HHHL到OCP3.0 TSFF,一篇讲透
  • 亲密的网络旅程番外篇:亲手“造”出一个 VLAN 标签——从 Linux 命令行到 Wireshark 抓包的全流程实战
  • 2026 广州空调维修 线路老化检修 家电上门服务 官方甄选指南 - 金修达家庭维修
  • Any Listen跨平台音乐播放服务完整部署指南
  • 如何让经典MiniDisc设备重获新生:Platinum-MD完整使用指南
  • 3步高效配置阅读APP书源:一站式解锁海量小说资源的智能指南
  • 从零到一:基于ijkplayer打造你自己的高性能播放器(附Android/iOS集成与FFmpeg定制指南)
  • 终极重复文件清理指南:使用dupeGuru释放宝贵存储空间
  • 5分钟解锁游戏无限可能:BepInEx插件框架完全指南
  • 杰理之触摸开机后PB5无法控制的问题【篇】
  • 如何用Path of Building PoE2打造完美流放之路2角色:终极构建指南
  • VutronMusic:当音乐播放器开始思考你的聆听习惯
  • 如何快速上手Ghostwriter:专注写作的Markdown编辑器完整指南
  • 3个技巧彻底解决Windows 11文件资源管理器窗口混乱问题
  • 探险旅游翻译:跨越语言与自然的专业桥梁
  • 杰理之双IO口推灯【篇】
  • ML307 4G模块解决方案:为xiaozhi-esp32项目提供可靠的移动网络接入
  • 3分钟掌握B站视频解析:bilibili-parse让你的下载变得如此简单
  • Prompt Engineering Guide:从零开始的AI提示工程完整指南
  • 2026年华为云小白攻略:OpenClaw如何部署?Token Plan配置与大模型接入全解