本文將展示壹種略有不同的爬行動物。
以前我們的爬蟲從互聯網上抓取數據,因為網頁壹般都是用HTML,CSS,JavaScript代碼編寫的。因此,有很多成熟的技術來抓取網頁中的各種數據。這壹次,我們需要抓取的文檔是壹個PDF文件。本文將展示如何使用Python的camelot模塊從PDF文件中抓取表格數據。
在我們的日常生活和工作中,PDF文件無疑是最常用的文件格式之壹,小到教材、課件,大到合同、策劃書。然而,如何從PDF文件中提取表格是壹個大問題。因為PDF中沒有內部表示來表示表格。這使得提取用於分析的表格數據變得困難。那麽,我們如何從PDF中抓取表格數據呢?
答案是Python的卡梅洛特模塊!
Camelot是Python的壹個模塊,它使任何人都可以輕松地從PDF文件中提取表格數據。您可以使用以下命令安裝camelot模塊(這需要很長時間):
pip安裝camelot-pycamelot模塊的官方文檔地址為:https://camelot-py.readthedoc...
下面將展示如何使用camelot模塊從PDF文件中抓取表格數據。
例1首先我們來看壹個簡單的例子:eg.pdf,整個文檔只有壹頁,而這壹頁只有壹個表格,如下:
使用以下Python代碼提取PDF文件中的表格:
進口卡米洛特
#從PDF文件中提取表格
tables = Camelot . read _ pdf(' E://eg . pdf ',pages='1 ',flavor='stream ')
#表格信息
打印(表格)
打印(表格[0])
#表格數據
打印的輸出結果(表[0])。數據)是:
& lttable list n = 1 & gt;
& lt表格形狀=(4,4)>
[['ID ',' name ',' city ',' gender'],['1 ',' Alex ',' Shanghai ',' m'],['2 ',' Bob ',' Beijing ',' f'],['f] Camelot.read_PDF()是Camelot從表中提取數據的函數。輸入參數是PDF文件的路徑、頁面和表格解析方法(有兩種方法:stream和lattice)。對於表格解析方法,默認的方法是lattice,而stream方法默認會將整個PDF頁面解析為表格。如果需要在解析頁面中指定區域,可以使用參數table_area。
Camelot模塊的方便之處還在於它提供了將提取的表格數據直接轉換成pandas、csv、JSON和html的函數,比如tables[0]。df,表[0]。to_csv()函數。讓我們以輸出csv文件為例:
進口卡米洛特
#從PDF文件中提取表格
tables = Camelot . read _ pdf(' E://eg . pdf ',pages='1 ',flavor='stream ')
#將表格數據轉換為csv文件
從表[0]中獲取的csv文件。to_csv('E://eg.csv ')如下:
例2例2中,我們將提取PDF頁面中某個區域的表格數據。PDF文件的頁面(部分)如下:
為了提取整個頁面中唯壹的表,我們需要定位該表。PDF文件的坐標系不同於圖片的坐標系。它以左下角的頂點為原點,X軸向右,Y軸向上。可以通過下面的Python代碼輸出整個頁面的坐標:
進口卡米洛特
#從PDF中選擇壹個表格
tables = Camelot . read _ pdf(' G://Statistics-Fundamentals-essentially . pdf ',pages='53 ',
flavor='stream ')
#畫出PDF文檔的坐標並定位表格。
表[0]的輸出。情節('文本')是:
用戶警告:第-53頁找不到表格[stream.py: 292]整個代碼中找不到表格,因為stream方法中默認將整個PDF頁面視為表格,所以找不到表格。但是繪制的圖像頁面坐標如下:
仔細對比之前的PDF頁面,我們不難發現,表格對應區域的坐標是左上角的(50,620),右下角的(500,540)。我們將table_area參數添加到read_pdf()函數中。完整的Python代碼如下:
進口卡米洛特
#識別指定區域中的表格數據
tables = Camelot . read _ pdf(' G://Statistics-Fundamentals-essentially . pdf ',pages='53 ',
flavor='stream ',table_area=['50,620,500,540'])
#畫出PDF文檔的坐標並定位表格。
table_df = tables[0]。df
打印(類型(table_df))
print(table_df.head(n=6))輸出的結果是:
& ltclass ' pandas . core . frame . data frame ' & gt;
0 1 2 3
0學生測試前分數測試後分數差異
1 1 70 73 3
2 2 64 65 1
3 3 69 63 -6
四
5 34 82 88 6摘要在PDF頁面中識別表格時,除了指定區域的參數外,還有下標、單元格合並等參數。詳細用法請參考卡梅洛特官網:https://camelot-py.readthedoc...