1

我正在尝试从 pdf 中提取特定表格,pdf 如下图所示

在此处输入图像描述

我尝试在 python 上使用不同的库,

使用 tabula-py

from tabula import read_pdf
from tabulate import tabulate 
df = read_pdf("./tmp/pdf/Food Calories List.pdf")
df

使用 PyPDF2

pdf_file = open("./tmp/pdf/Food Calories List.pdf", 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
        
data = page_content
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
        
aux = page_content
df = pd.DataFrame([x.split(';') for x in aux.split('\n')])

即使有文本和美丽的汤,我面临的问题是输出格式一团糟,有没有办法用更好的格式提取这个表?

4

3 回答 3

3

我怀疑问题源于表已合并单元格(在左侧)并且从表中读取数据仅在行和单元格一致而不是某些合并而某些不合并时才有效。

我会跳过前两列,然后在加载表格后在左侧重新创建/填充它们(例如,作为 pandas 数据框)。

然后,您可以每行有一个标签并始终如一地处理数据,否则每列单元格的编号将不一致。

于 2020-07-22T21:46:52.453 回答
0

Camelot可以是另一个可以尝试的 Python 库。它的高级设置似乎表明它可以处理合并的单元格。但是,这可能需要对某些设置进行一些调整,例如 copy_text 和 shift_text。

注意:Camelot 只能读取基于文本的表格。如果表格在图像中,它将无法提取它。

如果上述不是问题,请尝试以下示例代码:

import camelot
tables = camelot.read_pdf('./tmp/pdf/Food Calories List.pdf', pages='1', copy_text=['v'])
print(tables[0].df)
于 2020-10-12T05:17:51.777 回答
0

我会考虑使用表格模板,您可以根据页面上的单词位置动态生成这些模板。这将为 tabula 提供更多关于考虑哪个区域的指导,并导致更准确的提取。请参见tabula.read_pdf_with_template此处记录:https ://tabula-py.readthedocs.io/en/latest/tabula.html#tabula.io.read_pdf_with_template 。

于 2020-08-10T16:11:09.070 回答