PythonDocx:提取文本以及标题和子标题编号

PythonDocx:提取文本以及标题和子标题编号,python,docx,python-docx,Python,Docx,Python Docx,我有一个word文档,其结构如下: 1. Heading 1.1. Sub-heading (a) Sub-sub-heading 当我使用代码在docx中加载文档时: import docx def getText(filename): doc = docx.Document(filename) fullText = [] for para in doc.paragraphs: fullText.append(para.tex

我有一个word文档,其结构如下:

1. Heading
    1.1. Sub-heading
        (a) Sub-sub-heading
当我使用代码在
docx
中加载文档时:

import docx

def getText(filename):
    doc = docx.Document(filename)
    fullText = []
    for para in doc.paragraphs:
        fullText.append(para.text)
    return '\n'.join(fullText)
print(getText("a.docx"))
我得到以下输出

Heading
Sub-heading
Sub-sub-heading

如何提取标题/子标题编号以及文本?我试过了,但这只适用于标准MS Word标题样式,而不适用于自定义标题样式。

不幸的是,数字不是文本的一部分,而是由Word本身根据标题样式(
标题I
)生成的,我不知道
docx
公开任何获取此数字的方法

但是,您可以使用
para.style
检索样式/级别,然后通读文档以重新计算编号方案。但是,这很麻烦,因为它没有考虑到您可能使用的任何自定义样式。可能有一种方法可以访问文档
style.xml
部分中的编号方案,但我不知道如何访问

导入docx
级别_从_样式_名称={f'标题{i}”:范围(10)中的i表示i
def格式级别(当前级别):
levs=[str(l)表示当前级别中的l,如果l!=0]
返回“.”。加入(levs)#在此处自定义格式
d=docx.Document('my_doc.docx')
当前_级别=[0]*10
全文=[]
对于d.段中的p:
如果p.style.name不在\u style\u name的级别\u中:
全文附加(p.text)
其他:
level=level\u from\u style\u name[p.style.name]
当前_级别[级别]+=1
对于范围内的l(级别+1,10):
当前_级别[l]=0
全文.append(格式级别(当前级别)+''+p.text)
对于l,全文如下:
印刷品(l)
从哪来的

给我

你好,世界
1 H1 foo
1.1 H2巴
1.1.1 H3-baz
你真的很好!
1.1.2 H3 bibou
别的
2 H1福福
你得到了训练…

工作起来很有魅力。对于任何未来的读者,“level_from_style_name”字典可以使用您的自定义样式及其各自的级别进行修改。