0

经过一些在线阅读后,我决定使用 tabula-py 从 pdf 文件中提取表格。我们使用 Anaconda,我刚刚安装了 tabula-py 1.1.1。

我想从一个简单的脚本开始,看看它会如何处理带有一些文本和两个表格的单页 pdf 文件(“table_p16.pdf”)。

编码:

from tabula import read_pdf
df = read_pdf("table_p16.pdf")

错误:

拿起 JAVA_TOOL_OPTIONS: -Djava.security.properties=c:\Windows\Sun\Java\Deployment\sam.security

回溯(最近一次通话最后):

文件“H:/Personlich/SVN/blademat_tb/blademat_toolbox/utility/read_pdf.py”,第 41 行,在 df = read_pdf("table_p16.pdf")

文件“C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\tabula\wrapper.py”,第 117 行,在 read_pdf return pd.read_csv(io.BytesIO(output) , **pandas_options)

文件“C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py”,第 709 行,在 parser_f 返回 _read(filepath_or_buffer, kwds)

文件“C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py”,第 455 行,在 _read data = parser.read(nrows)

文件“C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py”,第 1069 行,读取 ret = self._engine.read(nrows )

文件“C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py”,第 1839 行,读取数据 = self._reader.read(nrows )

文件“pandas/_libs/parsers.pyx”,第 902 行,在 pandas._libs.parsers.TextReader.read

文件“pandas/_libs/parsers.pyx”,第 924 行,在 pandas._libs.parsers.TextReader._read_low_memory

文件“pandas/_libs/parsers.pyx”,第 978 行,在 pandas._libs.parsers.TextReader._read_rows

文件“pandas/_libs/parsers.pyx”,第 965 行,在 pandas._libs.parsers.TextReader._tokenize_rows

文件“pandas/_libs/parsers.pyx”,第 2208 行,在 pandas._libs.parsers.raise_parser_error

pandas.errors.ParserError:数据标记错误。C 错误:预计第 9 行中有 8 个字段,看到 9

我尝试过的事情:

  • 由于该错误似乎表明熊猫存在问题,因此我尝试使用一张表格阅读单页 pdf。同样的错误也成立。
  • 将用户变量 PATH 设置为 Java。没有改变任何东西。无法将系统变量 PATH 设置为 Java,因为它目前用于我们的 SVN 程序。
  • 不同的代码行,具有相同的错误:

    df = read_pdf(r"table_p9.pdf")
    df = read_pdf(r"table_p9.pdf")
    df = read_pdf("table_p9.pdf", output_format='json')
    

我希望有人能插手帮助我找出问题所在。这可能是 Java 问题,但我对所需的 Java 交互不是很熟悉。非常感谢您的帮助。

编辑

我尝试了不同的表,有些似乎正在工作。很难确定哪种类型的表格有效。一些“合并”列和其他“合并”行似乎工作。但显然不是全部。此外,我无法使用参数 multiple_tables=True 读取多个表(2 或 3)。

Tabula 可以处理什么样的表格?这让我想知道 Tabula 是否是正确的程序。在我阅读完所有内容之后,我的印象是 Tabula 会擅长这一点。它似乎很难处理的表格并不复杂。

是否有关于如何最大限度地利用 Tabula 的清晰简单的资料?或者有关如何处理 Tabula 难以处理的表格的其他提示?

问候,加布里埃尔

4

1 回答 1

4

这是 tabula(或 tabula-py)选项的粗略指南。

1) 将单元格与内衬表合并您可以使用lattice=True选项。使用 lattice 模式,tabula 可以适当地处理表格行。请注意,您可能需要对合并的单元格进行后期编辑某种填充。我经历了一些合并的列是用左对齐提取的。

AFAIK,表格很难提取没有表格行的合并单元格。

tabula 的一般调整点是lattice, stream, guess

2)在一页或多页中有多个表格这是 tabula-py 特定的选项,您必须使用multiple_tables=True选项。

默认情况下,tabula-py 尝试通过 CSV 提取表。虽然这种方法可以从 pandas.read_csv 函数中获益,例如推断列名。read_csv 假定 PDF 中有一个表(相同列大小的表)。具有不同列大小的 pandas.read_csv 会导致 ParserError。

另一方面,通过multiple_tables选项,tabula-py 通过 JSON 创建 DataFrame,可以表示多个表。

另一种选择。从 tabula-py 1.3.0 开始,您可以将 Tabla 应用程序模板与 tabula-py 一起使用。从模板中获取区域数据,您可以使用准确的区域信息更适当地提取。

于 2018-09-28T00:36:28.713 回答