赞
踩
最近需要用python读取docx文档,然后遇到python-docx无法读取到自动编号的问题,例如我们要读取的docx文档:
接下来我们读取文档的文本内容:
from docx import Document
doc = Document('simple.docx')
for para in doc.paragraphs:
text = para.text
print(text)
运行结果:
这是一个示例docx文档
下面是自动编号
csdn
作者:JoanSF
性别:男
可以看到结果没有打印出来自动编号,在网上查阅了很久都没有找到一个很好的解决办法,最终靠着摸索出了一个比较有效的方法,仅供大家参考,如果不对的地方,欢迎大家提出意见。
网上还是存在一些相关文章说明python-docx库能够找到自动编号的位置,但是不能找到对应编号的序号,否则大家只能一般默认是序号为1开始,但是我遇到的情况恰恰是序号不是从1开始的文档,所以光是找到自动编号的位置不行,还需要找到对应正确的序号。
由于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) 性别:男
虽然例子简单,但是花费小编(菜鸡一枚)辛苦一天,而且复杂点的自动编号也可以根据这个思路改,看完的各位大佬记得点赞
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。