如何解决Python读取PDF内容慢的问题

Python012

如何解决Python读取PDF内容慢的问题,第1张

1,引言

晚上翻看《Python网络数据采集》这本书,看到读取PDF内容的代码,想起来前几天集搜客刚刚发布了一个抓取网页pdf内容的抓取规则,这个规则能够把pdf内容当成html来做网页抓取。神奇之处要归功于Firefox解析PDF的能力,能够把pdf格式转换成html标签,比如,div之类的标签,从而用GooSeeker网页抓取软件像抓普通网页一样抓取结构化内容。

从而产生了一个问题:用Python爬虫的话,能做到什么程度。下面将讲述一个实验过程和源代码。

2,把pdf转换成文本的Python源代码

下面的python源代码,读取pdf文件内容(互联网上的或是本地的),转换成文本,打印出来。这段代码主要用了一个第三方库PDFMiner3K把PDF读成字符串,然后用StringIO转换成文件对象。(源代码下载地址参看文章末尾的GitHub源)

from urllib.request import urlopenfrom pdfminer.pdfinterp import PDFResourceManager, process_pdffrom pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom io import StringIOfrom io import opendef readPDF(pdfFile):

rsrcmgr = PDFResourceManager()

retstr = StringIO()

laparams = LAParams()

device = TextConverter(rsrcmgr, retstr, laparams=laparams)

process_pdf(rsrcmgr, device, pdfFile)

device.close()

content = retstr.getvalue()

retstr.close()    return content

pdfFile = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf")

outputString = readPDF(pdfFile)print(outputString)

pdfFile.close()

如果PDF文件在你的电脑里,那就把urlopen返回的对象pdfFile替换成普通的open()文件对象。

3,展望

这个实验只是把pdf转换成了文本,但是没有像开头所说的转换成html标签,那么在Python编程环境下是否有这个能力,留待今后探索。

4,集搜客GooSeeker开源代码下载源

1. GooSeeker开源Python网络爬虫GitHub源

5,文档修改历史

2016-05-26:V2.0,增补文字说明

2016-05-29:V2.1,增加第六章:源代码下载源,并更换github源的网址

最近在做一些数据分析的任务,很多都是pdf文件,试过pdfminer,pypdf2。pdfminer可以较好地读出里面的文字内容,但是一旦碰到类似于表格的排版,就会分块按列来读,导致解析出来的结果排班很乱。比如下面图片中的内容

解析出来是:

教育背景

2011.09-2015.06

重庆大学

工作经历

软件工程

而我预期的是:

教育背景

2011.09-2015.06  重庆大学  软件工程

工作经历

pypdf2效果更一般,很多中文字和符号都不能识别。Textract,Tika我也试过,都不行。请问大家有没有更好的python PDF包呢?或者是我的处理方式不对?我的代码如下:

from pdfminer.pdfinterp import PDFResourceManager, process_pdf

from pdfminer.converter import TextConverter

from pdfminer.layout import LAParams

from io import StringIO

from io import open

from subprocess import call

def readPDF(pdfFile):

rsrcmgr = PDFResourceManager()

retstr = StringIO()

laparams = LAParams()

device = TextConverter(rsrcmgr, retstr, laparams=laparams)

process_pdf(rsrcmgr, device, pdfFile, check_extractable=True)

device.close()

content = retstr.getvalue()

retstr.close()

return content

你可以试一下在线pdf装换试试效果

效果好的话用再 selenium 来处理

在用其他包转你需要的

我觉得你的那个包不好用是不是因为没有那种字体啊?

可以使用numpy.fromfile(),也可以使用open(filename, 'rb'),其中的'b'就是二进制的意思,然后使用文件类型的read方法,读取一些字节,再用struct.unpack()方法来解析二进制。

第一种方法是一次性读入文件(或文件的前多少个连续字节)到一个数组中,因此,灵活性差。

第二种方法灵活性很高,可以读取任意位置(使用文件的seek()方法跳跃位置)的二进制数据,再使用struct.unpack()方法来进行各种二进制解析。

提示:二进制文件是不保留存储方式的数据格式,因此,读二进制文件时应该知道二进制文件的存储格式。