用Python自动提取Word文档的文字、表格和图片

内容分享3小时前发布
0 0 0

告别重复复制粘贴,Python助你高效处理办公文档

在日常工作中,我们常常需要从Word文档中提取内容:可能是整理报告中的表格数据,提取文章中的图片素材,或者批量处理多个文档的文字内容。今天,就给大家介绍一个强劲的Python库——python-docx,帮你轻松实现Word文档的自动化处理!

一、python-docx:Word文档的Python解析器

python-docx是一个专门用于读取、查询和修改Microsoft Word (.docx)文件的Python库。它让我们能够以编程方式操作Word文档,极大地提高了文档处理的效率。

安装简单

pip install python-docx

二、实战:三步提取Word文档全内容

让我们通过一个完整的示例,看看如何提取Word文档中的文字、表格和图片。

1. 文字内容提取:不仅仅是纯文本

文字提取是基础,但python-docx能做的远不止这些:

from docx import Document

class DocxParser:
    def __init__(self, docx_path: str):
        self.docx_path = docx_path
        self.docx = Document(docx_path)
    
    def get_paragraph_contents(self):
        """提取段落内容和格式信息"""
        para_contents = []
        for para in self.docx.paragraphs:
            if para.text.strip():  # 跳过空段落
                # 提取每个文本段的XML信息,包含格式
                xml_lst = []
                for run in para.runs:
                    xml_lst.append(run._element.xml)
                
                para_contents.append({
                    "text": para.text,
                    "style": para.style.name,  # 样式名称(标题、正文等)
                    "xml": "
".join(xml_lst)  # 底层XML,包含格式信息
                })
        return para_contents

关键点:

  • paragraphs:获取所有段落
  • runs:同一段落内不同格式的文本段
  • style.name:识别标题、正文等样式

2. 表格提取:从Word到JSON的无缝转换

表格数据提取是办公自动化的重点。我们采用Markdown表格作为中间格式,再转换为JSON:

def get_md_tables(self):
    """将Word表格转换为Markdown格式"""
    table_md_lst = []
    
    for table in self.docx.tables:
        table_content = []
        idx = 1
        for row in table.rows:
            if idx == 2:  # 添加Markdown表格分隔行
                cell_size = len(row.cells)
                table_content.append(f"{'|---' * cell_size}|")
            
            row_data = [cell.text.strip() for cell in row.cells]
            table_content.append(f"|{'|'.join(row_data)}|")
            idx += 1
        
        table_md_lst.append("
".join(table_content))
    
    return table_md_lst

Markdown表格转JSON的函数:

import json
import re

def markdown_table_to_json(markdown_text: str) -> str:
    """将Markdown表格转换为JSON格式"""
    lines = markdown_text.strip().split('
')
    lines = [line.strip() for line in lines if line.strip()]
    
    if len(lines) < 2:
        return json.dumps([])
    
    # 提取表头
    header_line = lines[0]
    headers = [h.strip() for h in re.split(r's*|s*', header_line.strip('| '))]
    
    # 提取数据行
    data_lines = lines[2:]
    result = []
    
    for data_line in data_lines:
        cells = [cell.strip() for cell in re.split(r's*|s*', data_line.strip('| '))]
        if len(cells) == len(headers):
            row_dict = {headers[i]: cells[i] for i in range(len(headers))}
            result.append(row_dict)
    
    return json.dumps(result, ensure_ascii=False, indent=2)

这种转换方式的优势:

  • 标准化:Markdown是通用的轻量级标记语言
  • 可读性:JSON格式便于后续程序处理
  • 灵活性:可以轻松转换为CSV、Excel等其他格式

3. 图片提取:挖掘文档中的视觉资产

Word文档本质上是ZIP压缩包,图片存储在特定目录中:

import zipfile
import os
from pathlib import Path

def get_images(self):
    """提取Word文档中的所有图片"""
    image_lst = []
    
    docx_path = Path(self.docx_path)
    with zipfile.ZipFile(self.docx_path, 'r') as zip_ref:
        for file in zip_ref.namelist():
            if file.startswith('word/media/'):  # 图片存储位置
                file_name = os.path.basename(file)
                if file_name:
                    # 保存图片到本地
                    image_path = os.path.join(
                        docx_path.parent, 
                        f"{docx_path.stem}_{file_name}"
                    )
                    with open(image_path, 'wb') as img_file:
                        img_file.write(zip_ref.read(file))
                        image_lst.append(image_path)
    
    return image_lst

三、完整示例:一键处理Word文档

将所有功能整合,创建一个完整的解析器:

if __name__ == '__main__':
    # 初始化解析器
    parser = DocxParser("你的文档.docx")
    
    print("=== 表格内容 ===")
    tables = parser.get_md_tables()
    for i, table in enumerate(tables, 1):
        print(f"
表格{i} (Markdown格式):")
        print(table)
        
        # 转换为JSON
        json_data = markdown_table_to_json(table)
        print(f"
表格{i} (JSON格式):")
        print(json_data)
    
    print("
=== 段落内容 ===")
    for para_dict in parser.get_paragraph_contents():
        print(f"【{para_dict['style']}{para_dict['text'][:50]}...")
    
    print("
=== 图片提取 ===")
    images = parser.get_images()
    for img_path in images:
        print(f"已提取: {img_path}")

四、高级技巧与注意事项

1. 处理特殊格式

# 提取超链接
def extract_hyperlinks(self):
    hyperlinks = []
    for para in self.docx.paragraphs:
        for run in para.runs:
            if run.hyperlink:
                hyperlinks.append({
                    "text": run.text,
                    "url": run.hyperlink.target
                })
    return hyperlinks

# 提取列表
def extract_lists(self):
    lists = []
    for para in self.docx.paragraphs:
        if para.style.name.startswith('List'):
            lists.append(para.text)
    return lists

2. 批量处理多个文件

import glob
from pathlib import Path

def batch_process(folder_path: str, output_dir: str):
    """批量处理文件夹中的所有Word文档"""
    docx_files = glob.glob(f"{folder_path}/*.docx")
    
    for docx_file in docx_files:
        print(f"处理: {Path(docx_file).name}")
        
        parser = DocxParser(docx_file)
        
        # 保存提取结果
        base_name = Path(docx_file).stem
        with open(f"{output_dir}/{base_name}.txt", 'w', encoding='utf-8') as f:
            # 写入文字内容
            for para in parser.get_paragraph_contents():
                f.write(f"{para['text']}
")
            
            # 写入表格
            tables = parser.get_md_tables()
            for table in tables:
                f.write(f"
{table}
")

3. 常见问题解决

问题1:中文乱码
确保使用UTF-8编码读取和保存文件:

with open("output.txt", "w", encoding="utf-8") as f:
    f.write(content)

问题2:图片格式不识别
Word可能存储多种图片格式,可以扩展支持的格式:

SUPPORTED_IMAGES = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.emf', '.wmf']

问题3:复杂表格处理
对于合并单元格等复杂表格,可能需要更复杂的处理逻辑,可以结合表格的XML结构进行解析。

五、总结

python-docx为我们打开了一扇自动化处理Word文档的大门。通过简单的Python代码,我们能够:

  1. 精准提取:不仅获取文本,还能保留格式信息
  2. 智能转换:将表格转换为结构化的JSON数据
  3. 资源回收:轻松提取文档中的图片资源
  4. 批量处理:一次性处理成百上千个文档

办公自动化的核心价值在于释放人力,让计算机处理重复性工作,让人专注于创造性思考。掌握python-docx,你就能将大量手动操作转变为几行代码,真正实现”一次编写,多次运行”。

代码不是魔法,但好的自动化脚本的确 能让工作像魔法一样轻松!

© 版权声明

相关文章

暂无评论

none
暂无评论...