題圖來自Camelot: List o’ 10 Intriguing Mythical Places
為獲取LEED認(rèn)證項(xiàng)目的評(píng)分表明細(xì)喧务,可以從USGBC的項(xiàng)目頁面上爬取眯漩,或者從pdf格式的項(xiàng)目評(píng)分表中解析得到续膳。以重慶某LEED EM:OB v2009 Gold項(xiàng)目為例院尔,USGBC上公布的LEED項(xiàng)目得分表其格式并不統(tǒng)一,利用XPath爬取后需要進(jìn)一步清洗處理影钉。相對(duì)而言季惩,LEED項(xiàng)目所對(duì)應(yīng)的項(xiàng)目評(píng)分表PDF文件的數(shù)據(jù)更為規(guī)范完整录粱。因此考慮嘗試解析出PDF文件中的表格,以便后續(xù)分析画拾。
Python 處理PDF文件的程序包啥繁,pdfminer、tabula碾阁、pdfplumber输虱、camelot……查詢資料表明,似乎普遍認(rèn)為pdfminer的效果不怎么好脂凶,而tabula需要java支持 宪睹,想偷懶于是只試了pdfplumber和camelot。
安裝過程不贅述蚕钦,直接來看運(yùn)行結(jié)果亭病。
pdfplumber未能正確識(shí)別出表格
如上圖,直接利用pdfplumber的extract_table()默認(rèn)參數(shù)下運(yùn)行報(bào)錯(cuò)嘶居,沒有正確解析出pdf文件中的表格罪帖。利用to_image()和debug_tablefinder()可視化的結(jié)果表明,pdfplumber沒能將表格行列正確解析邮屁。
相比之下整袁,camelot就相對(duì)省心得多。說相對(duì)省心是因?yàn)橛恿撸琧amelot能解析出pdf文件中的表格內(nèi)容坐昙,但必須指定read_pdf()命令中參數(shù)flavor='stream'而不能采用缺省值。如若不然芋忿,運(yùn)行時(shí)報(bào)錯(cuò) RuntimeError: Please make sure that Ghostscript is installed炸客,即便是已正確安裝Ghostscript疾棵,并且設(shè)置好了path路徑仍不可避免。
由于Scorecard.pdf文件中的排版原因众弓,默認(rèn)參數(shù)得到的表格有空白行等情況梨州,不過這些都可以在識(shí)別出的DataFrame表格基礎(chǔ)上簡單后處理來解決。處理后的結(jié)果如下所示田轧。
pdfplumber解析表格的替代解決方案
pdfplumber無法直接解析出Scorecard.pdf文件中的表格,但實(shí)際上要解決此問題也并非難事鞍恢。調(diào)整下思路傻粘,可先解析出pdf文件中的文本,讓后通過分列來得到表格帮掉。
利用pdfplumber的extract_text()命令可解析出pdf文件中的文本弦悉,但由于本次需要解析的得分表pdf文件的排版的原因,左右兩個(gè)表格的文本行并未完全對(duì)齊蟆炊,因此如果直接解析完整頁面上的文本的話稽莉,文字會(huì)出錯(cuò)。先用corp()命令指定識(shí)別范圍涩搓,然后再extract_text()污秆,識(shí)別得到的文本列表如下所示。
先將字符串中'/'前后的空格去除后按空白字符分列昧甘,可以很方便的得到評(píng)分子項(xiàng)良拼、評(píng)價(jià)指標(biāo)描述以及得分分值。
Camelot解析指定范圍內(nèi)的表格
對(duì)于類似本例中Scorecard.pdf表格排版有錯(cuò)位的情況充边,也可以按照表格在頁面中所處的位置庸推,指定表格識(shí)別的范圍。所用到的指令:camelot.plot()可以繪制出頁面的略圖浇冰,table_area參數(shù)可以指定表格識(shí)別的范圍贬媒。
結(jié)論
- pdfplumber和camelot均能最終得到LEED項(xiàng)目的評(píng)分表pdf文件中的表格,雖然二者實(shí)現(xiàn)方法有所不同肘习,但最終的目標(biāo)都已實(shí)現(xiàn)际乘。
- 個(gè)人更傾向首選camelot。原因在于pdfplumber在識(shí)別文字時(shí)需事先指定表格對(duì)應(yīng)的頁面位置大致范圍井厌。而LEED認(rèn)證的版本與項(xiàng)目不同蚓庭,評(píng)價(jià)指標(biāo)與分值設(shè)置均不同致讥,意味著評(píng)分表的行數(shù)可能有所區(qū)別。如果后續(xù)想批處理識(shí)別多個(gè)項(xiàng)目的評(píng)分表pdf文件的話器赞,可能會(huì)導(dǎo)致出錯(cuò)垢袱。當(dāng)然也許是本人技術(shù)不到家,沒有去找出pdfplumber可用的參數(shù)設(shè)置港柜,感興趣的可在Github: pdfplumber 獲取更詳細(xì)的資料请契。
關(guān)于Camelot識(shí)別pdf表格時(shí)遇到諸如多行數(shù)據(jù)自動(dòng)合并瑰钮、上下標(biāo)文字鳖孤、自動(dòng)擴(kuò)大識(shí)別區(qū)域等情況時(shí)的參數(shù)設(shè)置,可參見Camelot識(shí)別pdf表格時(shí)的參數(shù)設(shè)置補(bǔ)充熏版。
又及畔柔,Camelot原來是亞瑟王和圓桌騎士們的宮殿所在地氯夷,和Asgard的Valhalla一樣,也是傳說中的圣域靶擦。搜索camelot程序安裝包時(shí)無意中學(xué)到的腮考,漲知識(shí)了。
參考資料
[1] Python:解析PDF文本及表格——pdfminer玄捕、tabula踩蔚、pdfplumber 的用法及對(duì)比
[2] 用Python提取pdf文件中的表格數(shù)據(jù)
[3] python讀取pdf文件
[4] Github: pdfplumber
[5] Camelot: PDF Table Extraction for Humans
[6] ImageMagick Installation
[7] ImageMagick之PDF轉(zhuǎn)換成圖片(image)
[8] LEED 2009 for Existing Buildings: Operations & Maintenance
[9] Camelot - Wikipedia
[10] List o’ 10 Intriguing Mythical Places
[11] Camelot識(shí)別pdf表格時(shí)的參數(shù)設(shè)置補(bǔ)充