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