【问题标题】:Is it possible extract a specific table with format from a PDF?是否可以从 PDF 中提取具有格式的特定表格?
【发布时间】:2020-11-12 12:59:58
【问题描述】:

我正在尝试从 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')])

即使有texttract和beautiful soup,我面临的问题是输出格式一团糟,有没有办法以更好的格式提取这个表?

【问题讨论】:

    标签: python data-cleaning pypdf2 tabula pdf-scraping


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        Camelot 可以作为另一个 Python 库来尝试。它的advanced 设置似乎表明它可以处理合并的单元格。但是,这可能需要对某些设置进行一些调整,例如 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          • 2017-02-24
          • 1970-01-01
          相关资源
          最近更新 更多