如何实现重文本PDF/HTML结构化段落提取并导出指定格式Excel
方案结论
该需求完全可实现,无需硬编码大量分支判断,基于EUR-Lex平台文档的标准化结构,按以下步骤实现即可稳定输出符合字段要求的Excel表格。
具体实现步骤
1. 补全缺失的页码信息
放弃纯HTML解析丢页码、纯PDF解析结构乱的二选一思路,用双源匹配的方式解决:
- 用
pymupdf(导入名为fitz)加载官方PDF文件,逐页提取所有文本块,每个文本块自带所在页码属性,建立「文本片段:页码」的映射字典,取文本前20个字符做匹配键即可,容错率足够。 - 保留同版本HTML做结构解析,遍历HTML段落节点时,用段落文本前20个字符去映射字典里查对应页码,直接给节点挂载页码属性,不需要手动识别PDF排版。
2. 替换硬编码匹配为正则+状态机
你之前遇到的章节重复匹配、引用内容重复问题,本质是没有做上下文状态留存和节点去重,不需要引入NLTK,用基础正则加三个状态变量就能解决:
- 初始化三个全局状态变量,遍历DOM节点时实时更新:
doc_title:固定为文档总标题,即欧盟《人工智能法案》(Regulation (EU) 2024/1689)current_section:存储当前所属一级节标题,初始为空current_subtitle:存储当前所属二级子节标题,初始为空
- 编写两个基础正则规则匹配层级标题,匹配到对应节点时立刻更新对应状态变量:
- 一级节匹配规则:
r'^(CHAPTER|Section)\s+[IVX0-9]+',适配EUR-Lex文档统一的「CHAPTER/Section + 罗马/阿拉伯数字编号」的一级标题格式 - 二级子节匹配规则:
r'^(Article|Subsection)\s+[0-9]+',适配「Article/Subsection + 阿拉伯数字编号」的二级标题格式
- 一级节匹配规则:
- 节点去重逻辑:每处理完一个节点,给节点加
data-processed=1的自定义标记,后续遍历到带该标记的节点直接跳过,彻底解决引用内容重复写入的问题。 - 有效正文判断逻辑:排除匹配到的一二级标题节点,过滤掉页脚、版权声明类节点(这类节点统一以
/*、纯数字页码开头,直接正则过滤即可),剩余的<p>标签节点即为需要写入的正文段落。
3. 直接写入Excel,跳过中间文本文件
你已经完成表头写入的前提下,不需要额外输出格式化中间文件,直接逐行写入即可:
- 行号从1开始计数(第0行留作已写好的表头),每识别到一个有效正文段落,按列顺序写入五个字段:
- 第0列:节点挂载的页码值
- 第1列:固定的
doc_title值 - 第2列:当前状态的
current_subtitle值 - 第3列:当前状态的
current_section值 - 第4列:用
BeautifulSoup的.get_text(strip=True)方法提取的段落纯文本,自动去除多余换行、首尾空格
- 每写完一行,行号自增1即可。
注意事项
- 不要尝试纯PDF解析章节结构,EUR-Lex的PDF存在跨页断行、标题被文本块拆分的问题,HTML做结构解析+PDF补页码的组合方案稳定性远高于纯PDF解析。
- 正则匹配不需要写得过于严格,只要匹配标题开头的编号特征就更新状态,段落内的有序/无序列表内容直接归属到当前状态对应的章节下即可,不需要额外解析列表层级。
- 如果遇到标题被拆分到多个相邻
<span>标签的情况,直接拼接相邻同层级标题节点的文本,再赋值给对应状态变量即可。
内容的提问来源于stack exchange,提问作者n00bee
相关产品推荐
相关产品推荐

