摘要:本文將展示如何利用的模塊從文件中爬取表格數據。但如何從文件中提取其中的表格,這卻是一個大難題。我們以輸出文件為例從文件中提取表格將表格數據轉化為文件得到的文件如下例在例中,我們將提取頁面中的某一區域的表格的數據。
簡介
??本文將展示一個稍微不一樣點的爬蟲。
??以往我們的爬蟲都是從網絡上爬取數據,因為網頁一般用HTML,CSS,JavaScript代碼寫成,因此,有大量成熟的技術來爬取網頁中的各種數據。這次,我們需要爬取的文檔為PDF文件。本文將展示如何利用Python的camelot模塊從PDF文件中爬取表格數據。
??在我們的日常生活和工作中,PDF文件無疑是最常用的文件格式之一,小到教材、課件,大到合同、規劃書,我們都能見到這種文件格式。但如何從PDF文件中提取其中的表格,這卻是一個大難題。因為PDF中沒有一個內部的表示方式來表示一個表格。這使得表格數據很難被抽取出來做分析。那么,我們如何做到從PDF中爬取表格數據呢?
??答案是Python的camelot模塊!
??camelot是Python的一個模塊,它能夠讓任何人輕松地從PDF文件中提取表格數據??梢允褂靡韵旅畎惭bcamelot模塊(安裝時間較長):
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)
輸出結果為:
[["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))輸出的結果為:
總結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...。
注意:本人現已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關注哦~~
參考文獻camelot模塊的官方文檔:https://camelot-py.readthedoc...
Camelot:一個從pdf抽取表格數據的Python庫:https://blog.csdn.net/qq_4092...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44853.html
相關文章
爬蟲 - 收藏集 - 掘金
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標配系統。 爬蟲修煉之道——從網頁中提取結構化數據并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網絡爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉為絕對URL,如何限速,...
記一次還可以搶救一下的爬蟲私活,求接盤!
摘要:前言最近接了一個爬蟲的私活,收益頗豐。項目需求一個類似百度文庫的網站,要求給出獲得文章,以形式保存下來。但是這次需要保存到這不難,難在要求格式不變。文章都是以許多標簽組合在一起的。知情人請告知,感激不盡。 前言 最近接了一個爬蟲的私活,收益頗豐。自認為對爬蟲掌握的還算不錯,爬過很多國內外網站,數據超過百萬,應對過封IP、設驗證碼、假數據、強制登錄等反爬蟲手段。于是乎,我毫不猶豫的接下了...
python爬蟲——爬取小說 | 探索白子畫和花千骨的愛恨情仇
摘要:先打開花千骨小說的目錄頁,是這樣的。網頁結構分析首先,目錄頁左上角有幾個可以提高你此次爬蟲成功后成就感的字眼暫不提供花千骨全集下載。打開盤查看花千骨文件。 知識就像碎布,記得縫一縫,你才能華麗麗地亮相。 1.Beautiful Soup 1.Beautifulsoup 簡介 此次實戰從網上爬取小說,需要使用到Beautiful Soup。Beautiful Soup為python的...
使用Node.js爬取任意網頁資源并輸出高質量PDF文件到本地~
摘要:上面只爬取了京東首頁的圖片內容,假設我的需求進一步擴大,需要爬取京東首頁中的所有標簽對應的跳轉網頁中的所有的文字內容,最后放到一個數組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無論是否有爬蟲以及Node.js基礎的朋友觀看~ 需求: 使用Node.js爬取網頁資源,開箱即用的配置 將爬取到的...
發表評論
0條評論
Anchorer
男|高級講師
TA的文章
閱讀更多
實用的 CSS — 貝塞爾曲線(cubic-bezier)
閱讀 1675·2019-08-30 12:51
2018年底前端面試總結
閱讀 662·2019-08-29 17:30
初識css層疊上下文
閱讀 3700·2019-08-29 15:17
CSS用法的一些總結
閱讀 859·2019-08-28 18:10
UCloud云主機更新CentOS系統
閱讀 1365·2019-08-26 17:08
數組
閱讀 2174·2019-08-26 12:16
react native搭建運行環境(一)
閱讀 3438·2019-08-26 11:47
擁有一款屬于自己的小程序之入門-天氣小程序
閱讀 3505·2019-08-23 16:18
閱讀需要支付1元查看