成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

另類(lèi)爬蟲(chóng):從PDF文件中爬取表格數(shù)據(jù)

Anchorer / 3787人閱讀

摘要:本文將展示如何利用的模塊從文件中爬取表格數(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ù)。

例1

??首先,讓我們看一個(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é)果為:


         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
總結(jié)

??在具體識(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,如何限速,...

    1fe1se 評(píng)論0 收藏0
  • 記一次還可以搶救一下的爬蟲(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)手段。于是乎,我毫不猶豫的接下了...

    alanoddsoff 評(píng)論0 收藏0
  • 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的...

    newsning 評(píng)論0 收藏0
  • 使用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)箱即用的配置 將爬取到的...

    seasonley 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Anchorer

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看


<