![](https://img.haomeiwen.com/i2616660/3b068f8f6afc6d0a.jpg)
题图来自Camelot: List o’ 10 Intriguing Mythical Places
为获取LEED认证项目的评分表明细,可以从USGBC的项目页面上爬取,或者从pdf格式的项目评分表中解析得到。以重庆某LEED EM:OB v2009 Gold项目为例,USGBC上公布的LEED项目得分表其格式并不统一,利用XPath爬取后需要进一步清洗处理。相对而言,LEED项目所对应的项目评分表PDF文件的数据更为规范完整。因此考虑尝试解析出PDF文件中的表格,以便后续分析。
Python 处理PDF文件的程序包,pdfminer、tabula、pdfplumber、camelot……查询资料表明,似乎普遍认为pdfminer的效果不怎么好,而tabula需要java支持 ,想偷懒于是只试了pdfplumber和camelot。
安装过程不赘述,直接来看运行结果。
pdfplumber未能正确识别出表格
![](https://img.haomeiwen.com/i2616660/5b26e1ea44c5dbc1.jpg)
如上图,直接利用pdfplumber的extract_table()默认参数下运行报错,没有正确解析出pdf文件中的表格。利用to_image()和debug_tablefinder()可视化的结果表明,pdfplumber没能将表格行列正确解析。
相比之下,camelot就相对省心得多。说相对省心是因为,camelot能解析出pdf文件中的表格内容,但必须指定read_pdf()命令中参数flavor='stream'而不能采用缺省值。如若不然,运行时报错 RuntimeError: Please make sure that Ghostscript is installed,即便是已正确安装Ghostscript,并且设置好了path路径仍不可避免。
![](https://img.haomeiwen.com/i2616660/527368ea9ecbb6e0.jpg)
![](https://img.haomeiwen.com/i2616660/eb6f1972b32cdb53.jpg)
![](https://img.haomeiwen.com/i2616660/40eef748694fec7a.jpg)
由于Scorecard.pdf文件中的排版原因,默认参数得到的表格有空白行等情况,不过这些都可以在识别出的DataFrame表格基础上简单后处理来解决。处理后的结果如下所示。
![](https://img.haomeiwen.com/i2616660/d91f09f5e999dbb0.jpg)
pdfplumber解析表格的替代解决方案
pdfplumber无法直接解析出Scorecard.pdf文件中的表格,但实际上要解决此问题也并非难事。调整下思路,可先解析出pdf文件中的文本,让后通过分列来得到表格。
![](https://img.haomeiwen.com/i2616660/01e68c3fb5d1101c.jpg)
利用pdfplumber的extract_text()命令可解析出pdf文件中的文本,但由于本次需要解析的得分表pdf文件的排版的原因,左右两个表格的文本行并未完全对齐,因此如果直接解析完整页面上的文本的话,文字会出错。先用corp()命令指定识别范围,然后再extract_text(),识别得到的文本列表如下所示。
![](https://img.haomeiwen.com/i2616660/39d77dcdbda8576d.jpg)
先将字符串中'/'前后的空格去除后按空白字符分列,可以很方便的得到评分子项、评价指标描述以及得分分值。
![](https://img.haomeiwen.com/i2616660/e7425c2fc5fd9e37.jpg)
Camelot解析指定范围内的表格
对于类似本例中Scorecard.pdf表格排版有错位的情况,也可以按照表格在页面中所处的位置,指定表格识别的范围。所用到的指令:camelot.plot()可以绘制出页面的略图,table_area参数可以指定表格识别的范围。
![](https://img.haomeiwen.com/i2616660/f20b9dec1a3455e5.jpg)
结论
- pdfplumber和camelot均能最终得到LEED项目的评分表pdf文件中的表格,虽然二者实现方法有所不同,但最终的目标都已实现。
- 个人更倾向首选camelot。原因在于pdfplumber在识别文字时需事先指定表格对应的页面位置大致范围。而LEED认证的版本与项目不同,评价指标与分值设置均不同,意味着评分表的行数可能有所区别。如果后续想批处理识别多个项目的评分表pdf文件的话,可能会导致出错。当然也许是本人技术不到家,没有去找出pdfplumber可用的参数设置,感兴趣的可在Github: pdfplumber 获取更详细的资料。
又及,Camelot原来是亚瑟王和圆桌骑士们的宫殿所在地,和Asgard的Valhalla一样,也是传说中的圣域。搜索camelot程序安装包时无意中学到的,涨知识了。
参考资料
[1] Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及对比
[2] 用Python提取pdf文件中的表格数据
[3] python读取pdf文件
[4] Github: pdfplumber
[5] Camelot: PDF Table Extraction for Humans
[6] ImageMagick Installation
[7] ImageMagick之PDF转换成图片(image)
[8] LEED 2009 for Existing Buildings: Operations & Maintenance
[9] Camelot - Wikipedia
[10] List o’ 10 Intriguing Mythical Places
网友评论