本文將展示壹個稍微不壹樣點的爬蟲。
以往我們的爬蟲都是從網絡上爬取數據,因為網頁壹般用HTML,CSS,JavaScript代碼寫成,因此,有大量成熟的技術來爬取網頁中的各種數據。這次,我們需要爬取的文檔為PDF文件。本文將展示如何利用Python的camelot模塊從PDF文件中爬取表格數據。
在我們的日常生活和工作中,PDF文件無疑是最常用的文件格式之壹,小到教材、課件,大到合同、規劃書,我們都能見到這種文件格式。但如何從PDF文件中提取其中的表格,這卻是壹個大難題。因為PDF中沒有壹個內部的表示方式來表示壹個表格。這使得表格數據很難被抽取出來做分析。那麽,我們如何做到從PDF中爬取表格數據呢?
答案是Python的camelot模塊!
camelot是Python的壹個模塊,它能夠讓任何人輕松地從PDF文件中提取表格數據。可以使用以下命令安裝camelot模塊(安裝時間較長):
pip install camelot-pycamelot模塊的官方文檔地址為:https://camelot-py.readthedoc...。
下面將展示如何利用camelot模塊從PDF文件中爬取表格數據。
例1首先,讓我們看壹個簡單的例子:eg.pdf,整個文件只有壹頁,這壹頁中只有壹個表格,如下:
使用以下Python代碼就可以提取該PDF文件中的表格:
import camelot
# 從PDF文件中提取表格
tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream')
# 表格信息
print(tables)
print(tables[0])
# 表格數據
print(tables[0].data)輸出結果為:
<TableList n=1>
<Table shape=(4, 4)>
[['ID', '姓名', '城市', '性別'], ['1', 'Alex', 'Shanghai', 'M'], ['2', 'Bob', 'Beijing', 'F'], ['3', 'Cook', 'New York', 'M']]分析代碼,camelot.read_pdf()為camelot的從表格中提取數據的函數,輸入的參數為PDF文件的路徑,頁碼(pages)和表格解析方法(有stream和lattice兩個方法)。對於表格解析方法,默認的方法為lattice,而stream方法默認會把整個PDF頁面當做壹個表格來解析,如果需要指定解析頁面中的區域,可以使用table_area這個參數。
camelot模塊的便捷之處還在於它提供了將提取後的表格數據直接轉化為pandas,csv,JSON,html的函數,如tables[0].df,tables[0].to_csv()函數等。我們以輸出csv文件為例:
import camelot
# 從PDF文件中提取表格
tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream')
# 將表格數據轉化為csv文件
tables[0].to_csv('E://eg.csv')得到的csv文件如下:
例2在例2中,我們將提取PDF頁面中的某壹區域的表格的數據。PDF文件的頁面(部分)如下:
為了提取整個頁面中唯壹的表格,我們需要定位表格所在的位置。PDF文件的坐標系統與圖片不壹樣,它以左下角的頂點為原點,向右為x軸,向上為y軸,可以通過以下Python代碼輸出整個頁面的文字的坐標情況:
import camelot
# 從PDF中提取表格
tables = camelot.read_pdf('G://Statistics-Fundamentals-Succinctly.pdf', pages='53',
flavor='stream')
# 繪制PDF文檔的坐標,定位表格所在的位置
tables[0].plot('text')輸出結果為:
UserWarning: No tables found on page-53 [stream.py:292]整個代碼沒有找到表格,這是因為stream方法默認將整個PDF頁面當作表格,因此就沒有找到表格。但是繪制的頁面坐標的圖像如下:
仔細對比之前的PDF頁面,我們不難發現,表格對應的區域的左上角坐標為(50,620),右下角的坐標為(500,540)。我們在read_pdf()函數中加入table_area參數,完整的Python代碼如下:
import camelot
# 識別指定區域中的表格數據
tables = camelot.read_pdf('G://Statistics-Fundamentals-Succinctly.pdf', pages='53',
flavor='stream', table_area=['50,620,500,540'])
# 繪制PDF文檔的坐標,定位表格所在的位置
table_df = tables[0].df
print(type(table_df))
print(table_df.head(n=6))輸出的結果為:
<class 'pandas.core.frame.DataFrame'>
0 1 2 3
0 Student Pre-test score Post-test score Difference
1 1 70 73 3
2 2 64 65 1
3 3 69 63 -6
4
5 34 82 88 6總結在具體識別PDF頁面中的表格時,除了指定區域這個參數,還有上下標、單元格合並等參數,詳細地使用方法可參考camelot官方文檔網址:https://camelot-py.readthedoc...。