You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:43:12