本篇文章帶給大家的內容是關於Python如何實現從PDF文件中爬取表格資料(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
本文將展示一個稍微不一樣點的爬蟲。
以往我們的爬蟲都是從網路上爬取數據,因為網頁一般用HTML,CSS,JavaScript程式碼寫成,因此,有大量成熟的技術來爬取網頁中的各種數據。這次,我們需要爬取的文件為PDF文件。本文將展示如何利用Python的camelot模組從PDF檔案中爬取表格資料。
在我們的日常生活和工作中,PDF文件無疑是最常用的文件格式之一,小到教材、課件,大到合約、規劃書,我們都能見到這種文件格式。但如何從PDF文件中提取其中的表格,這卻是一個大難題。因為PDF中沒有一個內部的表示方式來表示一個表格。這使得表格資料很難被抽取來做分析。那麼,我們該如何做到從PDF中爬取表格資料呢?
答案是Python的camelot模組!
camelot是Python的一個模組,它能夠讓任何人輕鬆地從PDF檔案中提取表格資料。可使用以下指令安裝camelot模組(安裝時間較長):
pip install camelot-py
camelot模組的官方文件位址為:https://camelot-py.readthedoc...。
以下將展示如何利用camelot模組從PDF檔案中爬取表格資料。
首先,讓我們來看一個簡單的範例: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> <table> [['ID', '姓名', '城市', '性别'], ['1', 'Alex', 'Shanghai', 'M'], ['2', 'Bob', 'Beijing', 'F'], ['3', 'Cook', 'New York', 'M']]<p>分析程式碼, camelot.read_pdf()為camelot的從表格中提取資料的函數,輸入的參數為PDF檔案的路徑,頁碼(pages)和表格解析方法(有stream和lattice兩個方法)。對於表格解析方法,預設的方法為lattice,而stream方法預設會把整個PDF頁面當作一個表格來解析,如果需要指定解析頁面中的區域,可以使用table_area這個參數。 <br> camelot模組的便利之處還在於它提供了將提取後的表格資料直接轉換為pandas,csv,JSON,html的函數,如tables[0].df,tables[0].to_csv()函數等。我們以輸出csv檔為例:</p> <pre class="brush:php;toolbar:false">import camelot # 从PDF文件中提取表格 tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream') # 将表格数据转化为csv文件 tables[0].to_csv('E://eg.csv')
得到的csv檔如下:
為了提取整個頁面中唯一的表格,我們需要定位表格的位置。 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> 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</class>總結在具體辨識PDF頁面中的表格時,除了指定區域這個參數,還有上下標、單元格合併等參數,詳細地使用方法可參考camelot官方文檔網址:https://camelot-py.readthedoc...。
#
以上是Python如何實作從PDF檔案中爬取表格資料(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!