如何用Python 3.X提取docx文档中原有格式的编号列表?
提取DOCX编号列表的可行思路
- 深挖python-docx的列表处理能力:python-docx并非完全无法提取列表,你可以遍历文档段落,通过
paragraph.style判断是否为列表样式(通常样式名以List开头),再用paragraph._p.xpath('.//w:numPr/w:numId')获取numId值,结合document.numbering匹配对应编号规则。就算numId随机变化,也能通过段落的缩进级别(paragraph.paragraph_format.left_indent)判断层级,手动拼接出和原文档一致的列表结构。 - 用python-docx2txt直接提取可视化编号:这个库能直接提取带原生显示编号的文本(比如"1. xxx"、"1.1 xxx"),之后用正则匹配编号模式(如
^\d+\.\s、^\d+\.\d+\s)区分列表项与普通文本,跳过XML层面的numId问题,直接基于可见编号构建结构,比二次解析pandoc结果更简洁。 - Windows环境下调用Word COM接口:借助
win32com.client调用Word自身的解析能力,它能精准识别所有列表结构,不受numId异常影响。示例代码如下:import win32com.client as win32 word = win32.gencache.EnsureDispatch('Word.Application') doc = word.Documents.Open("目标文档路径.docx") for para in doc.Paragraphs: if para.Range.ListFormat.ListType != 0: level = para.Range.ListFormat.ListLevelNumber number_display = para.Range.ListFormat.ListString content = para.Range.Text.strip() # 此处可根据level和number_display构建层级列表 doc.Close() word.Quit() - 优化pandoc转换逻辑:用
pandoc -s 源文档.docx -o 输出文件.md将文档转为Markdown,Markdown会保留标准的编号列表结构,之后用Markdown解析库(如markdown-it-py)直接提取列表内容,比转成纯字符串再处理更可靠。
内容的提问来源于stack exchange,提问作者Dion
相关产品推荐
相关产品推荐

