[784]python解析PDF表格

  • 2020 年 3 月 28 日
  • 筆記

通過看別人寫的部落格,發現python裡面有關PDF解析的通常有以下四種:

  • pdfminer,擅長僅僅是文字的解析,本小白試過了,是把表格解析成普通的文本,還經常會伴隨一些莫名奇妙的不認識的符號。這個方案pass掉
  • pdf2html,看例是把pdf解析成html,但是html的標籤並沒有規律,解析一個還行,但是本小白是許多的pdf文檔下小標題的表格,這個方案直接pass掉
  • tabula,這個是我看過的前輩寫的部落格中使用最多的,本人用過了。對於簡單的表格,也就是單元格中沒有換行的,表頭表尾形式不複雜的,這個方案的值得推薦。電腦需要有Java的環境。
  • pdfplumber,這個是看了知乎上的一個大佬的發現,並且自己安裝成功之後,發現最小眾,但是最符合我的需求的解決方案。前提是是需要安裝ImageMagick的

方案1:tabula

import tabula    # Read pdf into DataFrame  df = tabula.read_pdf("./P26.pdf",pages=str(1))  print(df)

這個直接返回的是一個數據幀,所以就直接是結構化的數據啦!

輸出結果是這樣的:

[    序號               疑似失聯私募機構  0    1     中投國美投資基金管理(北京)有限公司  1    2           北京嘉宸投資基金有限公司  2    3     中融國晟投資基金管理(北京)有限公司  3    4     奧尼斯特(北京)投資基金管理有限公司  4    5       北京國信聯盟投資基金管理有限公司]

方案2:pdfplumber

import pdfplumber  import pandas as pd    pdf = pdfplumber.open("./P26.pdf")  p0 = pdf.pages[0]#注意此處的pages是一個列表,索引是從0開始的  table = p0.extract_table()  df = pd.DataFrame(table[1:], columns=table[0])  # df = pd.DataFrame(table[2:], columns=table[1])  print(df)

輸出結果是這樣的:

   序號 NaN NaN               疑似失聯私募機構                 NaN   NaN  0       1                             中投國美投資基金管理(北京)有限公司  1       2               北京嘉宸投資基金有限公司                None  None  2       3         中融國晟投資基金管理(北京)有限公司                None  None  3       4         奧尼斯特(北京)投資基金管理有限公司                None  None  4       5           北京國信聯盟投資基金管理有限公司                None  None

雖然為了展示對比的方便,這裡都是用了同樣的一個表格,但是方案2的解決真的要比1好

別問我為啥知道2比1好,你試試用1去解析一些帶有文字格式的表格,帶有複雜的表頭的表格,你就知道啦!我在這裡並沒有在瞎說,而且還得裝的的java的,後者只裝一個的ImageMagick的就行,而且ImageMagick的很有用的

pandas.core.frame.DataFrame 切片技巧

import pandas as pd  import numpy as np    df = pd.DataFrame(np.random.randn(6,4), columns=list('ABCD'))  print(df.iloc[3])  # 輸出第4行的值 索引以0開頭  print(df.iloc[3:5, 0:2])  # 輸出4-5行,1到2列  print(df.iloc[[1, 2, 4], [0, 2]])  # 輸出不連續行列的樹  print(df.iat[1, 1]) # 提取2行2列的數,提取單個數iat效率更高    print('分割線','*'*200)