在办公自动化场景中,我们常常需要处理Word文档里的表格数据,其中带编号的列表内容提取是比较常见的需求。Python的docx库可以很好地操作Word文档,但是要准确提取表格中的带编号列表,需要了解文档的内部结构和对应的解析方法。

环境准备
首先需要安装python-docx库,如果你还没有安装,可以通过pip命令完成安装:
pip install python-docx
Word表格与编号列表的结构认知
Word文档中的表格由<w:tbl>标签定义,每个单元格对应<w:tc>元素。而带编号的列表在docx的底层XML中,是通过<w:numPr>属性来标识的,这个属性会关联到具体的编号模板,同时列表的文本内容存放在<w:t>标签中。
我们需要先遍历表格的所有行和单元格,再检查每个单元格内的段落是否包含编号属性,最后提取对应的文本内容。
完整提取实现步骤
1. 读取Word文档并获取目标表格
首先加载Word文档,然后选择需要提取数据的表格,这里默认提取第一个表格,你也可以根据索引或者表格内容调整选择逻辑:
from docx import Document
# 加载Word文档
doc = Document("test.docx")
# 获取第一个表格,索引从0开始
target_table = doc.tables[0]
2. 遍历表格单元格识别编号列表
接下来遍历表格的所有行和单元格,检查每个单元格内的段落是否包含编号属性,同时提取对应的文本:
def extract_numbered_list_from_table(table):
result = []
# 遍历表格的所有行
for row in table.rows:
# 遍历行内的所有单元格
for cell in row.cells:
# 遍历单元格内的所有段落
for para in cell.paragraphs:
# 检查段落是否包含编号属性
if para._p.pPr is not None and para._p.pPr.numPr is not None:
# 提取段落文本,去除首尾空白
text = para.text.strip()
if text:
result.append(text)
return result
3. 调用函数输出结果
将前面两步的代码组合起来,执行提取并打印结果:
# 调用提取函数
numbered_list = extract_numbered_list_from_table(target_table)
# 打印提取结果
for item in numbered_list:
print(item)
常见问题与解决思路
- 如果提取到的编号列表文本包含多余的空行,可以在提取时增加判断,过滤掉空字符串内容。
- 如果Word文档中的编号是自定义格式,可能需要进一步解析
<w:numPr>对应的编号模板,获取完整的编号前缀,再和文本拼接。 - 当表格存在合并单元格时,docx库的
row.cells会重复返回合并后的单元格内容,需要额外做去重处理。
完整示例代码
以下是整合了所有逻辑的完整可运行代码:
from docx import Document
def extract_numbered_list_from_table(table):
result = []
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
# 判断段落是否带编号
if para._p.pPr is not None and para._p.pPr.numPr is not None:
text = para.text.strip()
if text:
result.append(text)
return result
if __name__ == "__main__":
# 替换为你的Word文档路径
doc_path = "test.docx"
doc = Document(doc_path)
# 提取第一个表格,可根据需求调整索引
target_table = doc.tables[0]
numbered_items = extract_numbered_list_from_table(target_table)
print("提取到的带编号列表内容:")
for idx, item in enumerate(numbered_items, 1):
print(f"{idx}. {item}")
通过以上方法,就可以快速从Word文档的表格中提取出所有带编号的列表内容,满足办公自动化中的数据提取需求。