如何用Python提取Word文档中带多级嵌套的目录结构?
解决Python提取docx多级嵌套目录并生成嵌套字典的问题
核心思路
利用python-docx读取文档段落的内置标题样式级别,通过栈结构动态维护当前层级的嵌套关系,自动适配任意深度的标题层级,彻底解决深层嵌套无法识别的问题。
实现代码
from docx import Document def extract_nested_headings(doc_path): doc = Document(doc_path) headings = [] stack = [] for para in doc.paragraphs: # 仅识别内置标题样式(Heading 1至Heading 9) if not para.style.name.startswith('Heading'): continue try: level = int(para.style.name.split()[-1]) except (IndexError, ValueError): continue # 跳过非标准命名的标题样式 title_text = para.text.strip() if not title_text: continue current_node = {'title': title_text, 'children': []} # 调整栈深度,匹配当前标题的父层级 while stack and stack[-1]['level'] >= level: stack.pop() if stack: stack[-1]['node']['children'].append(current_node) else: headings.append(current_node) stack.append({'level': level, 'node': current_node}) return headings # 使用示例 if __name__ == '__main__': result = extract_nested_headings('target_doc.docx') import json print(json.dumps(result, ensure_ascii=False, indent=2))
代码说明
- 样式识别逻辑:通过段落样式名判断是否为标题,提取末尾数字作为层级,兼容所有内置标题层级(1-9级)
- 栈结构作用:栈中存储当前路径的层级与对应节点,遇到更低层级时弹出栈顶元素,直到找到当前标题的父节点,确保嵌套关系正确
- 鲁棒性处理:跳过空标题、非标准标题样式,避免无效数据干扰结果
- 无层级限制:不受固定层级数约束,无论文档标题嵌套多深都能正确解析
注意事项
- 必须确保文档中的标题是通过Word内置标题样式设置的,而非手动调整字体格式,否则无法识别层级
- 若使用自定义标题样式,需修改
para.style.name的判断逻辑,比如匹配自定义样式名中的层级标识(如"MyHeading-3"中的数字3)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

