1
0
Files
Skill/temp/scripts
..
2026-02-14 23:20:47 +08:00
2026-02-14 21:11:37 +08:00
2026-02-14 23:20:47 +08:00
2026-02-14 23:20:47 +08:00
2026-02-14 21:11:37 +08:00
2026-02-14 23:20:47 +08:00
2026-02-14 21:11:37 +08:00

Document Parser 使用说明

一个模块化的文档解析器,支持将 DOCX、PPTX、XLSX 和 PDF 文件转换为 Markdown 格式。

概述

该解析器按优先级尝试多种解析方法,确保最大兼容性:

  1. MarkItDown (微软官方库) - 推荐使用,格式最规范
  2. python-docx / python-pptx / pandas (成熟的 Python 库) - 输出最详细
  3. unstructured / pypdf (成熟的 PDF 库) - PDF 专用
  4. XML 原生解析 (备选方案) - 无需依赖

特性

  • 支持 DOCX、PPTX、XLSX 和 PDF 格式
  • 自动检测文件类型和有效性
  • 保留文本格式(粗体、斜体、下划线)
  • 提取表格并转换为 Markdown 格式
  • 提取列表并保留层级结构
  • 多种输出模式(字数、行数、标题、搜索等)
  • 内容过滤和规范化
  • 模块化设计,易于维护和扩展

文件结构

scripts/
├── common.py     # 公共函数和常量
├── docx.py       # DOCX 文件解析
├── pptx.py       # PPTX 文件解析
├── xlsx.py       # XLSX 文件解析
├── pdf.py        # PDF 文件解析
├── parser.py     # 命令行入口
└── README.md     # 本文档

依赖要求

基础运行XML 解析)

# Python 3.6+
uv run parser.py file.docx

使用 MarkItDown

# 使用 uv 自动安装
uv run --with markitdown parser.py file.docx
uv run --with markitdown parser.py file.pptx
uv run --with markitdown parser.py file.xlsx
uv run --with "markitdown[pdf]" parser.py file.pdf

# 或手动安装
pip install markitdown
# 注意PDF 支持需要额外安装
pip install "markitdown[pdf]"

使用专用库

# 使用 uv 自动安装
uv run --with python-docx parser.py file.docx
uv run --with python-pptx parser.py file.pptx
uv run --with pandas --with tabulate parser.py file.xlsx
uv run --with unstructured parser.py file.pdf
uv run --with pypdf parser.py file.pdf

# 或手动安装
pip install python-docx
pip install python-pptx
pip install pandas tabulate
pip install unstructured
pip install pypdf

所有依赖

# 安装所有解析库
uv run --with markitdown --with python-docx --with python-pptx --with pandas --with tabulate --with unstructured --with pypdf parser.py file.pdf

命令行用法

基本语法

uv run parser.py <file_path> [options]

必需参数

  • file_path: DOCX、PPTX、XLSX 或 PDF 文件的路径(相对或绝对路径)

可选参数(互斥组,一次只能使用一个)

参数 短选项 长选项 说明
-c --count 返回解析后的 markdown 文档的总字数
-l --lines 返回解析后的 markdown 文档的总行数
-t --titles 返回解析后的 markdown 文档的标题行1-6级
-tc <name> --title-content <name> 提取指定标题及其下级内容(不包含#号)
-s <pattern> --search <pattern> 使用正则表达式搜索文档,返回所有匹配结果(用---分隔)

搜索上下文参数

  • -n <num> / --context <num>: 与 -s 配合使用指定每个检索结果包含的前后行数默认2

使用示例

1. 输出完整 Markdown 内容

# 使用最佳可用解析器 (DOCX/PPTX/XLSX)
uv run parser.py report.docx

# 使用最佳可用解析器 (PDF)
uv run parser.py report.pdf

# 输出到文件
uv run parser.py report.docx > output.md

# 使用特定依赖
uv run --with python-docx parser.py report.docx > output.md
uv run --with pypdf parser.py report.pdf > output.md

2. 统计文档信息

# 统计字数
uv run --with markitdown parser.py report.docx -c
uv run --with unstructured parser.py report.pdf -c

# 统计行数
uv run --with markitdown parser.py report.docx -l
uv run --with pypdf parser.py report.pdf -l

3. 提取标题

# 提取所有标题
uv run --with python-docx parser.py report.docx -t
uv run --with unstructured parser.py report.pdf -t

# 输出示例DOCX
# 第一章 概述
## 1.1 背景
## 1.2 目标
# 第二章 实现

# 输出示例PDF - 注意PDF 通常不包含明确的标题层级):
[内容提取成功,但 PDF 可能缺乏清晰的标题结构]

4. 提取特定标题内容

# 提取特定章节
uv run --with python-docx parser.py report.docx -tc "第一章"
uv run --with unstructured parser.py report.pdf -tc "第一章"

# 输出该标题及其所有子内容

5. 搜索文档内容

# 搜索关键词
uv run --with markitdown parser.py report.docx -s "测试"
uv run --with unstructured parser.py report.pdf -s "测试"

# 使用正则表达式
uv run --with markitdown parser.py report.docx -s "章节\s+\d+"
uv run --with pypdf parser.py report.pdf -s "章节\s+\d+"

# 带上下文搜索前后各2行
uv run --with markitdown parser.py report.docx -s "重要内容" -n 2
uv run --with "markitdown[pdf]" parser.py report.pdf -s "重要内容" -n 2

# 输出示例:
---
这是重要内容的前两行
**重要内容**
这是重要内容后两行
---

解析器对比

DOCX 解析器

解析器 优点 缺点 适用场景
MarkItDown • 格式规范
• 微软官方支持
• 兼容性好
• 需要安装
• 输出较简洁
• 需要标准格式输出
• 自动化文档处理
python-docx • 输出最详细
• 保留完整结构
• 支持复杂样式
• 需要安装
• 可能包含多余空行
• 需要精确控制输出
• 分析文档结构
XML 原生 • 无需依赖
• 运行速度快
• 输出原始内容
• 格式可能不统一
• 样式处理有限
• 依赖不可用时
• 快速提取内容

PPTX 解析器

解析器 优点 缺点 适用场景
MarkItDown • 格式规范
• 自动添加 Slide 分隔
• 输出简洁
• 需要安装
• 详细度较低
• 快速预览幻灯片
• 提取主要内容
python-pptx • 输出最详细
• 保留完整结构
• 支持层级列表
• 需要安装
• 依赖私有 API
• 需要完整内容
• 分析演示结构
XML 原生 • 无需依赖
• 结构化输出
• 运行速度快
• 格式可能不统一
• 幻灯片分组简单
• 依赖不可用时
• 结构化提取

XLSX 解析器

解析器 优点 缺点 适用场景
MarkItDown • 格式规范
• 支持多工作表
• 输出简洁
• 需要安装
• 详细度较低
• 快速预览表格
• 提取主要内容
pandas • 功能强大
• 支持复杂表格
• 数据处理灵活
• 需要安装
• 依赖较多
• 数据分析
• 复杂表格处理
XML 原生 • 无需依赖
• 运行速度快
• 支持所有单元格类型
• 格式可能不统一
• 无数据处理能力
• 依赖不可用时
• 快速提取内容

PDF 解析器

解析器 优点 缺点 适用场景
MarkItDown • 格式规范
• 微软官方支持
• 兼容性好
• 需要安装 markitdown[pdf]
• 输出较简洁
• 需要标准格式输出
• 自动化文档处理
unstructured • 功能强大
• 支持表格提取
• 文本组织性好
• 需要安装
• 可能包含页码标记
• 需要完整内容
• 分析文档结构
pypdf • 轻量级
• 速度快
• 安装简单
• 需要安装
• 功能相对简单
• 快速提取内容
• 简单文本提取

输出格式

Markdown 输出结构

# 标题 1 (一级)

正文段落

## 标题 2 (二级)

- 列表项 1
- 列表项 2

1. 有序列表项 1
2. 有序列表项 2

| 列1 | 列2 | 列3 |
|------|------|------|
| 数据1 | 数据2 | 数据3 |

**粗体文本** *斜体文本* <u>下划线文本</u>

PPTX 特有格式

## Slide 1

幻灯片 1 的内容

## Slide 2

表格内容

幻灯片 2 的内容

---

XLSX 特有格式

# Excel数据转换结果

来源: /path/to/file.xlsx

## Sheet1

| 列1 | 列2 | 列3 |
|------|------|------|
| 数据1 | 数据2 | 数据3 |

PDF 特有格式

[PDF 文件的纯文本内容,按段落提取]

中电信粤亿迅20233号

关于印发关于印发关于印发关于印发《《《《广东亿迅科技有限公司员工

[注PDF 通常不包含明确的标题层级结构,内容以文本流形式呈现]

标题格式

  • 标题使用 Markdown 井号语法:#######1-6级
  • 标题名称不包含井号
  • 段落通过空行分隔

表格格式

| 列1 | 列2 | 列3 |
|------|------|------|
| 数据1 | 数据2 | 数据3 |

列表格式

  • 无序列表:使用 - 前缀
  • 有序列表:使用 1. 前缀
  • 支持多层缩进(使用空格)

内容处理

自动处理

  1. 图片移除:自动删除 Markdown 图片语法
  2. 空行规范化:合并连续空行为单个空行
  3. 样式标签过滤:移除 HTML span 标签
  4. RGB 颜色过滤:移除颜色代码行

过滤规则filter_markdown_content

  • 保留:文本、表格、列表、基本格式
  • 移除:
    • HTML 注释 (<!-- ... -->)
    • Markdown 图片 (![alt](url))
    • HTML 图片标签 (<img>, </img>)
    • 媒体链接 ([text](file.ext))
    • RGB 颜色代码 (R:255 G:255 B:255)
  • 标准化:多余空格合并为单个空格

错误处理

文件验证

# 文件不存在
错误: 文件不存在: missing.docx

# 无效格式
错误: 不是有效的 DOCX、PPTX、XLSX 或 PDF 格式: invalid.txt

解析器回退

脚本按优先级尝试解析器,如果失败则自动尝试下一个:

所有解析方法均失败:
- MarkItDown: 库未安装
- python-docx: 解析失败: ...
- XML 原生解析: document.xml 不存在或无法访问

PDF 回退示例:

所有解析方法均失败:
- MarkItDown: MarkItDown 解析失败: ...
- unstructured: unstructured 库未安装
- pypdf: pypdf 库未安装

所有解析方法均失败:

  • MarkItDown: 库未安装
  • python-docx: 解析失败: ...
  • XML 原生解析: document.xml 不存在或无法访问

### 搜索错误

```bash
# 无效正则
错误: 正则表达式无效或未找到匹配: '[invalid'

# 标题未找到
错误: 未找到标题 '不存在的标题'

高级用法

结合 uv 运行

# 自动安装依赖并运行
uv run --with markitdown --with python-docx parser.py report.docx

# 输出到文件
uv run --with python-docx parser.py report.docx > output.md

批量处理

# 使用 find 或 glob 批量处理
for file in *.docx; do
    uv run --with markitdown parser.py "$file" > "${file%.docx}.md"
done

# Windows PowerShell
Get-ChildItem *.docx | ForEach-Object {
    uv run --with markitdown parser.py $_.FullName > ($_.BaseName + ".md")
}

管道使用

# 进一步处理 Markdown 输出
uv run --with markitdown parser.py report.docx | grep "重要" > important.md

# 统计处理
uv run --with markitdown parser.py report.docx -l | awk '{print $1}'

常见问题

Q: 为什么有些内容没有提取到?

A: 不同解析器的输出详细度不同:

  • python-docx / python-pptx 输出最详细
  • MarkItDown 输出较简洁
  • XML 原生 输出原始内容

如需完整内容,尝试使用专用库解析器。

Q: PDF 文件没有标题层级?

A: PDF 是一种版面描述格式,通常不包含语义化的标题层级结构。与 DOCX/PPTX 不同PDF 中的标题只是视觉上的文本样式,解析器无法准确识别标题层级。建议:

  • 使用搜索功能查找特定内容
  • 使用 -l 统计行数了解文档长度
  • 使用 -c 统计字数了解文档规模

Q: 表格格式不正确?

A: 确保原始文档中的表格结构完整。XML 解析器可能无法处理复杂表格。

Q: 中文显示乱码?

A: 脚本输出使用 UTF-8 编码。确保终端支持 UTF-8

# Linux/Mac
export LANG=en_US.UTF-8

# Windows PowerShell
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

Q: 如何只使用特定解析器?

A: 当前版本自动选择最佳可用解析器。可以通过注释代码中的解析器列表来限制,或安装/卸载特定依赖。

Q: MarkItDown 提示 PDF 依赖未安装?

A: MarkItDown 的 PDF 支持是可选依赖,需要使用 markitdown[pdf] 而非 markitdown

# 错误
uv run --with markitdown parser.py file.pdf

# 正确
uv run --with "markitdown[pdf]" parser.py file.pdf

# 或手动安装
pip install "markitdown[pdf]"

Q: 大文件处理慢?

A: 大文件建议使用 XML 原生解析(最快),或在脚本外部处理。

性能参考

基于测试文件的参考数据:

DOCX (test.docx)

解析器 字符数 行数 相对速度
MarkItDown ~8,500 ~123
python-docx ~8,500 ~123
XML 原生 ~8,500 ~123

PPTX (test.pptx)

解析器 字符数 行数 相对速度
MarkItDown ~2,500 ~257
python-pptx ~2,500 ~257
XML 原生 ~2,500 ~257

XLSX (test.xlsx)

解析器 字符数 行数 相对速度
MarkItDown ~6,000 ~109
pandas ~6,000 ~109
XML 原生 ~6,000 ~109

PDF (test.pdf)

解析器 字符数 行数 相对速度
MarkItDown ~8,200 ~1,120
unstructured ~8,400 ~600
pypdf ~8,400 ~600

代码风格

脚本遵循以下代码风格:

  • Python 3.6+ 兼容
  • 遵循 PEP 8 规范
  • 所有公共 API 函数添加类型提示
  • 字符串优先内联使用不提取为常量除非被使用超过3次
  • 其他被多次使用的对象根据具体情况可考虑被提取为常量(如正则表达式)
  • 模块级和公共 API 函数保留文档字符串
  • 内部辅助函数不添加文档字符串(函数名足够描述)
  • 变量命名清晰,避免单字母变量名

许可证

脚本遵循 PEP 8 规范Python 3.6+ 兼容。

更新日志

最新版本

  • 将单体脚本拆分为模块化结构common.py, docx.py, pptx.py, xlsx.py, parser.py
  • 添加 XLSX 文件支持
  • 添加 PDF 文件支持MarkItDown、unstructured、pypdf
  • 增强错误处理(文件存在性检查、无效格式检测)
  • 完善文档和示例
  • 使用 uv 进行依赖管理和运行
  • 所有模块通过语法检查和功能测试