python如何解析word文件格式(.docx)

python如何解析word文件格式(.docx)

.docx文件遵从开源的“Office Open XML标准”,这意味着我们能用python的文本操作对它进行操作(实际上PPT和Excel也是)。而且这并不是重复造轮子,因为市面上操作.docx的库限制性非常强:

  • python-docx是开源的,但不支持高级操作,例如增加批注、修订等。
  • spire.doc支持高级操作,但需要商业许可
  • 微软开放了word的api接口,但不是跨平台的。只支持win平台,且学习门槛较高

所以我们从开源的标准入手,用python实现操作word文件的功能。


看下图,把.docx文件的后缀手动改为.zip竟然可以直接解压。原来.docx本质上是一个zip压缩包。

请添加图片描述

解压后的word文件漏出了他的真实面目。原来.docx由很多.xml文件(及其他)组成。注意下图框出的word/document.xml,他是我们操作word文件的主角(有些高级功能不在其中,比如批注在另外的xml中)。因为其中记录了word文档的文本、字体、段落格式等。.xml是一个纯文本文件,理论上我们用python可以操作word/document.xml中定义的任何元素。

请添加图片描述

解释一下.xml格式:你可以粗略的把它理解为.html。区别在于.html的标记是预先定义好的,.xml的标记由架构或文档的作者定义,并且是无限制的。如果你没有接触过的话,我建议百度一下,有助于理解下面的内容。

我举个例子来看一下word/document.xml的结构,具体的含义写在注释里了:

<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">  # 注意这行,下文要用到!<w:body>  # body是文档的主体,是个nodelist,一般只有一个元素<w:p w:rsidR="00F921A6" w:rsidRDefault="00000000">  # p代表paragraph段落<w:pPr>  # pPr是段落属性<w:numPr><w:ilvl w:val="255"/><w:numId w:val="0"/></w:numPr><w:pBdr>  # 段落边框<w:top w:val="none" w:sz="0" w:space="0" w:color="000000"/><w:left w:val="none" w:sz="0" w:space="0" w:color="000000"/><w:bottom w:val="none" w:sz="0" w:space="7" w:color="000000"/><w:right w:val="none" w:sz="0" w:space="0" w:color="000000"/></w:pBdr><w:widowControl/>  # 控制孤行<w:spacing w:line="560" w:lineRule="exact"/>  # 行间距<w:ind w:firstLineChars="200" w:firstLine="640"/>  # 首行缩进<w:outlineLvl w:val="1"/>  # 标题级别<w:rPr>  # rPr是段落内的文本属性<w:rFonts w:ascii="方正仿宋_GBK" w:eastAsia="方正仿宋_GBK" w:hAnsi="Times New Roman"/><w:kern w:val="0"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:pPr><w:r>  # r代表run,可以理解为连续的文本块<w:rPr>  # rPr是文本属性<w:rFonts w:ascii="方正楷体_GBK" w:eastAsia="方正楷体_GBK" w:hAnsi="Times New Roman" w:hint="eastAsia"/>  # 字体<w:kern w:val="0"/>  # 字间距<w:sz w:val="32"/>  # 字号<w:szCs w:val="32"/>  # 字号?不知道</w:rPr><w:t>这是一段word中的文本</w:t>  # t是文本</w:r></w:p></w:body>
</w:document>

注意看上面xml的第一行,xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"定义了document及其子元素的命名空间。xmlns用来声明属性,比如这里xmlns:w代表绑定了w为前缀,那么子元素中所有前缀为w的都绑定到命名空间"http://schemas.openxmlformats.org/wordprocessingml/2006/main"为什么要着重讲命名空间呢?因为docx的前缀不是统一的,比如Microsoft Word一般用w,但是wps就不用w了,记得在操作之前先确定命名空间。


以上只是举个列子,实际上各种标记种类和用法非常多。具体的标记用法参考OOXML标准,你可以在下图画红框的地方查找(仅适用于Microsoft Word)。

OOXML标准的中文翻译:https://hellowac.github.io/ecma-376-zh-cn/

请添加图片描述

本文言尽于此,后面我会再把python的源码开放出来。

1.17更新:源码不放了,python-doc支持修订和批注了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android wifi framework与wpa_supplicant的交互

android frmework直接与wpa_supplicant进行交互&#xff0c;使用aidl或者hidl 二、事件 framework注册事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…

python爬虫报错日记

python爬虫报错日记 类未定义 原因&#xff1a;代码检查没有问题**&#xff0c;位置错了**&#xff0c;测试代码包含在类里…… UnicodedecodeError错误 原因&#xff1a;字符没有自动转换成utf-8格式 KeyError&#xff1a;“href” 原因&#xff1a;前面运行正常&#x…

[ Spring ] Install Nacos on Ubuntu24

文章目录 Download Nacos Package and UnzipConfigure NacosConfigure JAVA_HOME for Bash FileConfigure Default User and PasswordStartup NacosVisit Admin Webpage Download Nacos Package and Unzip https://github.com/alibaba/nacos/releases/download/3.0.0-alpha/na…

Swift语言的多线程编程

Swift语言的多线程编程 在现代软件开发中&#xff0c;多线程编程是提高应用性能和响应速度的重要手段。尤其是在 iOS 和 macOS 开发中&#xff0c;由于用户界面(UI)的交互性和复杂性&#xff0c;合理利用多线程可以极大地提升用户体验。本文将深入探讨 Swift 语言中的多线程编…

第34天:Web开发-PHP应用鉴别修复AI算法流量检测PHP.INI通用过滤内置函数

#知识点 1、安全开发-原生PHP-PHP.INI安全 2、安全开发-原生PHP-全局文件&单函数 3、安全开发-原生PHP-流量检测&AI算法 一、通用-PHP.INI设置 参考&#xff1a; https://www.yisu.com/ask/28100386.html https://blog.csdn.net/u014265398/article/details/109700309 …

机器学习之决策树(DecisionTree)

决策树中选择哪一个特征进行分裂&#xff0c;称之为特征选择。 特征选择是找出某一个特征使得分裂后两边的样本都有最好的“归宿”&#xff0c;即左边分支的样本属于一个类别、右边分支的样本属于另外一个类别&#xff0c;左边和右边分支包含的样本尽可能分属同一类别&#xff…

进阶——十六届蓝桥杯嵌入式熟练度练习(按键+LCD)

高亮&#xff08;一&#xff09; 声明 char buf[21];unsigned char upled0x04;uint8_t key_val;uint8_t key_down,key_up,key_old;uint32_t key_time;uint8_t key_temp,key_flag;uint8_t line_flag; 按键代码 void key_proc(void) { key_valkey_scan();key_downkey_val&…

基于PHP的校园新闻发布管理

摘要 近年来&#xff0c;随着互联网技术的迅速发展&#xff0c;人们获取新闻的渠道也变得越来越多样化&#xff0c;已经不再拘束于传统的报纸、期刊、杂志等纸质化的方式&#xff0c;而是通过网络满足了人们获得第一手新闻的愿望&#xff0c;这样更加有助于实现新闻的规范化管…

MySQL程序之:使用DNS SRV记录连接到服务器

在域名系统&#xff08;DNS&#xff09;中&#xff0c;SRV记录&#xff08;服务位置记录&#xff09;是一种资源记录&#xff0c;它使客户端能够指定指示服务、协议和领域的名称。DNS查找该名称会返回一个回复&#xff0c;其中包含该领域中提供所需服务的多个可用服务器的名称。…

代码合并冲突解决push不上去的问题

环境&#xff1a;【IntelliJ IDEA】 【Gerrit】 1、错误信息 代码合并&#xff0c;迭代1合并到迭代2&#xff0c;解决冲突后&#xff0c;依然push不上去&#xff0c;报错信息如下&#xff1a; remote: Processing changes: refs: 1 remote: Processing changes: refs…

opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数

opencv projectPoints函数 cv::projectPoints 是 OpenCV 中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置&#xff0c;考虑了相机的内参和外参。 函数原型 void cv::projectPoints(InputArray objectPoints,InputArray …

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…

boss直聘 __zp_stoken__ 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

Linux 内核自旋锁spinlock(一)

文章目录 前言一、自旋锁1.1 简介1.2 API1.2.1 spin_lock/spin_unlock1.2.2 spin_lock_irq/spin_unlock_irq1.2.3 spin_lock_irqsave/spin_unlock_irqstore1.2.4 spin_lock_bh/spin_unlock_bh1.2.5 补充 二、自选锁原理三、自旋锁在内核的使用3.1 struct file3.2 struct dentry…

【太古新篇,智驭未来】 SFA系统成功上线

经过双方团队的不懈努力与紧密合作&#xff0c;eBest成功帮助香港太古可乐完成了SFA系统的全面上线&#xff01; 太古可乐&#xff0c;作为饮料行业的佼佼者&#xff0c;一直以来以其卓越的品质和深入人心的品牌形象深受消费者喜爱。然而&#xff0c;在快速变化的市场环境中&am…

Web安全|渗透测试|网络安全

基础入门(P1-P5) p1概念名词 1.1域名 什么是域名&#xff1f; 域名&#xff1a;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 什么是二级域名多级域名…

陈萍的设计创新:Kevlin Nexus荣获伦敦设计奖,展示品牌设计的国际化与持续创新

近日,陈萍凭借其创新设计作品 Kevlin Nexus,成功斩获 2024 伦敦设计奖。该奖项旨在表彰全球范围内的优秀设计作品,表彰设计界最完美、最前沿的成就。伦敦设计奖是全球最具权威性和影响力的设计奖项之一,其评选标准以高水准的专业性和严格性著称。作为全球设计界的顶级荣誉,伦敦…

qml DirectionalBlur详解

1、概述 DirectionalBlur是QML&#xff08;Qt Modeling Language&#xff09;中用于创建方向模糊效果的一种图形效果类型。它通过对源图像的像素进行模糊处理&#xff0c;产生一种源项目朝着模糊方向移动的感知印象。这种模糊效果被应用到每个像素的两侧&#xff0c;因此设置方…

【Linux】【Vim】vim编辑器的用法

一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器&#xff0c;广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性&#xff0c;还增加了许多新的功能&#xff0c;如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式&#xff1a; 命令模式&am…