python docx 读取自动编号

最近需要用python读取docx文档,然后遇到python-docx无法读取到自动编号的问题,例如我们要读取的docx文档:
这是一个简单的docx文档示例,simple.docx
接下来我们读取文档的文本内容:

from docx import Document

doc = Document('simple.docx')

for para in doc.paragraphs:
    text = para.text
    print(text)

运行结果:

 这是一个示例docx文档
 下面是自动编号
 
 csdn
 作者:JoanSF
 性别:男

可以看到结果没有打印出来自动编号,在网上查阅了很久都没有找到一个很好的解决办法,最终靠着摸索出了一个比较有效的方法,仅供大家参考,如果不对的地方,欢迎大家提出意见。

python-docx只能找到自动编号的位置,而无法找到对应正确的序号

网上还是存在一些相关文章说明python-docx库能够找到自动编号的位置,但是不能找到对应编号的序号,否则大家只能一般默认是序号为1开始,但是我遇到的情况恰恰是序号不是从1开始的文档,所以光是找到自动编号的位置不行,还需要找到对应正确的序号。

docx文档竟然是压缩包

由于docx是压缩包,我们把simple.docx的后缀名改成zip,然后解压,然后我们就可以直接观察到docx的组成了
在这里插入图片描述
在word文件夹下有很多xml文件,其中的numbering.xml文件就是用来记录自动编号的信息,观察numbering.xml文件就可以发现 start 这里代表了自动编号的起始序号(这个例子不明显,但是小编的实际情况的序号是从68开始的,所以很快就发现了)
在这里插入图片描述
到现在,知道了自动编号的位置和自动编号的起始序号,这样我们就可以打印自动编号了

from docx import Document
import zipfile
from bs4 import BeautifulSoup

doc = Document('simple.docx')

document = zipfile.ZipFile('simple.docx')
xml_data = document.read('word/numbering.xml')
document.close()
soup = BeautifulSoup(xml_data,'xml')
string = str(soup.find('start'))
# 得到自动编号的起始序号
ind = int(eval(string.split('w:val=')[-1].split('/')[0]))

for para in doc.paragraphs:
    text = para.text
    num_pr = para._p.pPr.numPr
    if num_pr is not None: # 判断是否有自动编号
        print('{}) '.format(ind)+text)
        ind += 1
    else:
        print(text)

运行结果:

这是一个示例docx文档
下面是自动编号

1) csdn
2) 作者:JoanSF
3) 性别:男

虽然例子简单,但是花费小编(菜鸡一枚)辛苦一天,而且复杂点的自动编号也可以根据这个思路改,看完的各位大佬记得点赞

  • 30
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值