摘要:本文將展示如何利用的模塊從文件中爬取表格數(shù)據(jù)。但如何從文件中提取其中的表格,這卻是一個大難題。我們以輸出文件為例從文件中提取表格將表格數(shù)據(jù)轉(zhuǎn)化為文件得到的文件如下例在例中,我們將提取頁面中的某一區(qū)域的表格的數(shù)據(jù)。
簡介
??本文將展示一個稍微不一樣點的爬蟲。
??以往我們的爬蟲都是從網(wǎng)絡(luò)上爬取數(shù)據(jù),因為網(wǎng)頁一般用HTML,CSS,JavaScript代碼寫成,因此,有大量成熟的技術(shù)來爬取網(wǎng)頁中的各種數(shù)據(jù)。這次,我們需要爬取的文檔為PDF文件。本文將展示如何利用Python的camelot模塊從PDF文件中爬取表格數(shù)據(jù)。
??在我們的日常生活和工作中,PDF文件無疑是最常用的文件格式之一,小到教材、課件,大到合同、規(guī)劃書,我們都能見到這種文件格式。但如何從PDF文件中提取其中的表格,這卻是一個大難題。因為PDF中沒有一個內(nèi)部的表示方式來表示一個表格。這使得表格數(shù)據(jù)很難被抽取出來做分析。那么,我們?nèi)绾巫龅綇腜DF中爬取表格數(shù)據(jù)呢?
??答案是Python的camelot模塊!
??camelot是Python的一個模塊,它能夠讓任何人輕松地從PDF文件中提取表格數(shù)據(jù)。可以使用以下命令安裝camelot模塊(安裝時間較長):
pip install camelot-py
camelot模塊的官方文檔地址為:https://camelot-py.readthedoc...。
??下面將展示如何利用camelot模塊從PDF文件中爬取表格數(shù)據(jù)。
??首先,讓我們看一個簡單的例子:eg.pdf,整個文件只有一頁,這一頁中只有一個表格,如下:
使用以下Python代碼就可以提取該PDF文件中的表格:
import camelot # 從PDF文件中提取表格 tables = camelot.read_pdf("E://eg.pdf", pages="1", flavor="stream") # 表格信息 print(tables) print(tables[0]) # 表格數(shù)據(jù) print(tables[0].data)
輸出結(jié)果為:
[["ID", "姓名", "城市", "性別"], ["1", "Alex", "Shanghai", "M"], ["2", "Bob", "Beijing", "F"], ["3", "Cook", "New York", "M"]]
分析代碼,camelot.read_pdf()為camelot的從表格中提取數(shù)據(jù)的函數(shù),輸入的參數(shù)為PDF文件的路徑,頁碼(pages)和表格解析方法(有stream和lattice兩個方法)。對于表格解析方法,默認(rèn)的方法為lattice,而stream方法默認(rèn)會把整個PDF頁面當(dāng)做一個表格來解析,如果需要指定解析頁面中的區(qū)域,可以使用table_area這個參數(shù)。
??camelot模塊的便捷之處還在于它提供了將提取后的表格數(shù)據(jù)直接轉(zhuǎn)化為pandas,csv,JSON,html的函數(shù),如tables[0].df,tables[0].to_csv()函數(shù)等。我們以輸出csv文件為例:import camelot # 從PDF文件中提取表格 tables = camelot.read_pdf("E://eg.pdf", pages="1", flavor="stream") # 將表格數(shù)據(jù)轉(zhuǎn)化為csv文件 tables[0].to_csv("E://eg.csv")得到的csv文件如下:
例2??在例2中,我們將提取PDF頁面中的某一區(qū)域的表格的數(shù)據(jù)。PDF文件的頁面(部分)如下:
為了提取整個頁面中唯一的表格,我們需要定位表格所在的位置。PDF文件的坐標(biāo)系統(tǒng)與圖片不一樣,它以左下角的頂點為原點,向右為x軸,向上為y軸,可以通過以下Python代碼輸出整個頁面的文字的坐標(biāo)情況:
import camelot # 從PDF中提取表格 tables = camelot.read_pdf("G://Statistics-Fundamentals-Succinctly.pdf", pages="53", flavor="stream") # 繪制PDF文檔的坐標(biāo),定位表格所在的位置 tables[0].plot("text")輸出結(jié)果為:
UserWarning: No tables found on page-53 [stream.py:292]整個代碼沒有找到表格,這是因為stream方法默認(rèn)將整個PDF頁面當(dāng)作表格,因此就沒有找到表格。但是繪制的頁面坐標(biāo)的圖像如下:
仔細(xì)對比之前的PDF頁面,我們不難發(fā)現(xiàn),表格對應(yīng)的區(qū)域的左上角坐標(biāo)為(50,620),右下角的坐標(biāo)為(500,540)。我們在read_pdf()函數(shù)中加入table_area參數(shù),完整的Python代碼如下:
import camelot # 識別指定區(qū)域中的表格數(shù)據(jù) tables = camelot.read_pdf("G://Statistics-Fundamentals-Succinctly.pdf", pages="53", flavor="stream", table_area=["50,620,500,540"]) # 繪制PDF文檔的坐標(biāo),定位表格所在的位置 table_df = tables[0].df print(type(table_df)) print(table_df.head(n=6))輸出的結(jié)果為:
總結(jié)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頁面中的表格時,除了指定區(qū)域這個參數(shù),還有上下標(biāo)、單元格合并等參數(shù),詳細(xì)地使用方法可參考camelot官方文檔網(wǎng)址:https://camelot-py.readthedoc...。
注意:本人現(xiàn)已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關(guān)注哦~~
參考文獻(xiàn)camelot模塊的官方文檔:https://camelot-py.readthedoc...
Camelot:一個從pdf抽取表格數(shù)據(jù)的Python庫:https://blog.csdn.net/qq_4092...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44853.html
相關(guān)文章
爬蟲 - 收藏集 - 掘金
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。 爬蟲修煉之道——從網(wǎng)頁中提取結(jié)構(gòu)化數(shù)據(jù)并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關(guān)注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網(wǎng)絡(luò)爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉(zhuǎn)為絕對URL,如何限速,...
記一次還可以搶救一下的爬蟲私活,求接盤!
摘要:前言最近接了一個爬蟲的私活,收益頗豐。項目需求一個類似百度文庫的網(wǎng)站,要求給出獲得文章,以形式保存下來。但是這次需要保存到這不難,難在要求格式不變。文章都是以許多標(biāo)簽組合在一起的。知情人請告知,感激不盡。 前言 最近接了一個爬蟲的私活,收益頗豐。自認(rèn)為對爬蟲掌握的還算不錯,爬過很多國內(nèi)外網(wǎng)站,數(shù)據(jù)超過百萬,應(yīng)對過封IP、設(shè)驗證碼、假數(shù)據(jù)、強制登錄等反爬蟲手段。于是乎,我毫不猶豫的接下了...
python爬蟲——爬取小說 | 探索白子畫和花千骨的愛恨情仇
摘要:先打開花千骨小說的目錄頁,是這樣的。網(wǎng)頁結(jié)構(gòu)分析首先,目錄頁左上角有幾個可以提高你此次爬蟲成功后成就感的字眼暫不提供花千骨全集下載。打開盤查看花千骨文件。 知識就像碎布,記得縫一縫,你才能華麗麗地亮相。 1.Beautiful Soup 1.Beautifulsoup 簡介 此次實戰(zhàn)從網(wǎng)上爬取小說,需要使用到Beautiful Soup。Beautiful Soup為python的...
使用Node.js爬取任意網(wǎng)頁資源并輸出高質(zhì)量PDF文件到本地~
摘要:上面只爬取了京東首頁的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴大,需要爬取京東首頁中的所有標(biāo)簽對應(yīng)的跳轉(zhuǎn)網(wǎng)頁中的所有的文字內(nèi)容,最后放到一個數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無論是否有爬蟲以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁資源,開箱即用的配置 將爬取到的...
發(fā)表評論
0條評論
Anchorer
男|高級講師
TA的文章
閱讀更多
實用的 CSS — 貝塞爾曲線(cubic-bezier)
閱讀 1678·2019-08-30 12:51
2018年底前端面試總結(jié)
閱讀 664·2019-08-29 17:30
初識css層疊上下文
閱讀 3703·2019-08-29 15:17
CSS用法的一些總結(jié)
閱讀 860·2019-08-28 18:10
UCloud云主機更新CentOS系統(tǒng)
閱讀 1368·2019-08-26 17:08
數(shù)組
閱讀 2178·2019-08-26 12:16
react native搭建運行環(huán)境(一)
閱讀 3441·2019-08-26 11:47
擁有一款屬于自己的小程序之入門-天氣小程序
閱讀 3507·2019-08-23 16:18
閱讀需要支付1元查看