You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免提取跨多页PDF表格时丢失第二页首行数据?

问题

我有一个总计33行(行数可能变动)的PDF表格,跨两页显示,被识别为两个独立表格。目标是提取第0、2、3列的所有数据并分别存入三个列表,功能已实现,但第二页首行数据丢失。

当前使用的Python脚本:

import tabula

file_path = "address.pdf"
tables = tabula.read_pdf(file_path, pages="all", multiple_tables=True)

full_range_index = 0
full_range = []

starting_range_index = 2
starting_range = []

ending_range_index = 3
ending_range = []

table_one_row_count = 27
table_two_row_count = 6

# for i in range(table_one_row_count):
#     extracted_row = tables[0].iloc[i].values.tolist()

#     full_range.append(extracted_row[full_range_index])
#     starting_range.append(extracted_row[starting_range_index])
#     ending_range.append(extracted_row[ending_range_index])

for i in range(table_two_row_count):
    extracted_row = tables[1].iloc[i].values.tolist()

    full_range.append(extracted_row[full_range_index])
    starting_range.append(extracted_row[starting_range_index])
    ending_range.append(extracted_row[ending_range_index])


print(full_range)

预期full_range为['one', 'two', 'three', 'four', 'five', 'six'],实际结果为[nan, 'two', 'three', 'four', 'five', 'six']。

解决方案

1. 关闭表头猜测,避免首行被误识别

第二页首行出现nan的核心原因是Tabula默认会猜测表头,把第二页的首行当成重复表头处理,导致数据被标记为空。修改read_pdf参数,强制关闭表头猜测:

tables = tabula.read_pdf(file_path, pages="all", multiple_tables=True, guess=False, header=None)

2. 动态获取表格行数,摒弃硬编码

不要用固定数值指定行数,直接通过表格的shape[0]获取实际行数,适配行数变动的情况:

# 处理第一个表格
for i in range(tables[0].shape[0]):
    extracted_row = tables[0].iloc[i].values.tolist()
    full_range.append(extracted_row[full_range_index])
    starting_range.append(extracted_row[starting_range_index])
    ending_range.append(extracted_row[ending_range_index])

# 处理第二个表格
for i in range(tables[1].shape[0]):
    extracted_row = tables[1].iloc[i].values.tolist()
    full_range.append(extracted_row[full_range_index])
    starting_range.append(extracted_row[starting_range_index])
    ending_range.append(extracted_row[ending_range_index])

3. 清理结果中的NaN值

如果仍有nan混入,用列表推导式过滤或替换:

import pandas as pd

# 过滤NaN值
full_range = [x for x in full_range if not pd.isna(x)]
# 或替换为空字符串
full_range = [x if not pd.isna(x) else "" for x in full_range]

4. 合并表格后批量提取(更高效)

既然原本是一个跨页表格,直接合并两个识别出的DataFrame,再提取对应列,简化代码:

import pandas as pd
import tabula

file_path = "address.pdf"
tables = tabula.read_pdf(file_path, pages="all", multiple_tables=True, guess=False, header=None)
# 合并两个表格
combined_table = pd.concat(tables, ignore_index=True)
# 提取指定列转为列表
full_range = combined_table.iloc[:, 0].tolist()
starting_range = combined_table.iloc[:, 2].tolist()
ending_range = combined_table.iloc[:, 3].tolist()
# 清理NaN
full_range = [x for x in full_range if not pd.isna(x)]

内容的提问来源于stack exchange,提问作者agw2021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:17:12