利用Camelot識別pdf文件中的表格,除了必須加上flavor = 'stream' ,以及指定 table_areas識別區域之外,補充下在識別pdf表格時遇到的如多行數據、上下標等情況時的參數設置。
Camelot的安裝及基本用法見 Python解析PDF表格——PDFPlumber vs Camelot ,
默認參數下,Camelot未能識別出全部的表格區域。如上圖,第3頁只識別出了15行,遠小於表格所在頁的行數。
除了在 Python解析PDF表格——PDFPlumber vs Camelot 介紹的用 camelot.plot() 命令查看表格所在區域然後再指定 table_areas 來處理外,也可以將'edge_tol'參數指定為壹個較大的數字,如本例中將 edge_tol = 500 ,讓Camelot自動擴大識別區域。
本例中,表頭和個別數據條,單元格中包含了多行文本,有可能需要將多行文字自動合並,此時涉及到'row_tel'參數的調整。將該參數數值增大,Camelot會自動將多行文字合並,但這樣也有可能帶來意想不到的結果。
如上圖,指定 row_tol = 40 雖然表頭部分的多行文字被自動合並為了壹行,合並後的文字用 '\n' 連接;但下面的數據條部分,也被Camelot給合並到了壹起,這顯然不是我們希望看到的結果。所以對於 'row_tol' 參數壹定是要視情況靈活處理,也提醒我們在識別表格時需要隨時檢查中間結果是否識別正確。
當單元格中存在上標時,指定 'flage_size = True' ,Camelot會在上標下標中自動加上<s> </s>標簽,如下圖所示。
'flage_size 參數用於指定是否分割識別的字符串,如下圖, 'flage_size = True' 時,表格外的字符串被分割後分到了各列。在本例中,這種自動分割的結果看起來並不是必須的,因為我們感興趣的是表格內的數據部分,表格以外的文字本就會舍去。
'strip_text 參數用於指定是否分割識別的字符串,如下圖, strip_text= ' ?§\n(<>)(</).'*,Camelot會在識別出文字後,自動刪去類似上下標標準'<s>'、'</s>',跨行單元格的'\n'等等。
Camelot識別後結果,各國的疫情數據是個字符串而不是數字,因此還需要利用pandas.to_numeric,或是astype(int)將數據類型轉換為數字型。
本例中上述參數設置如下。
最後用Pyecharts繪制地圖,結果如下: