如何使用Python3打开并阅读pdf(最初的.html)文件

时间:2015-07-08 12:46:21

标签: python pdf python-3.x web-scraping pdf-parsing

我需要在python3中打开这个文件:

http://www.arch.gob.ec/index.php/descargas/doc_download/478-historial-de-produccion-nacional-de-crudo-2011.html

我必须阅读它,并提取数据表。我搜索了好几个小时,但似乎没什么用。我是刮擦/解析的新手,这是我第一次查看PDF的文件处理。

感谢各种帮助!

2 个答案:

答案 0 :(得分:1)

从互联网上获取PDF称为抓取。试图阅读PDF以从中获取数据是另一个问题!

有许多实用程序可以尝试将PDF转换为文本 - 并非完全成功。正如this article所解释的那样,PDF文件很好用(看看),但内部结构并不优雅。原因是可见文本通常不直接出现在文档中,并且必须从表中重建。在某些情况下,PDF甚至不会包含文本,而只是文本的图像。

本文包含几个(尝试)将PDF转换为文本的工具。有些人有包装'在Python中访问它们。有一些听起来很有趣的模块,例如PyPDF(不转换为文本),但实际上并非如此。

aTXT对数据挖掘看起来很有趣 - 尚未对其进行测试。

如上所述,其中大多数是围绕现有的包装器(或GUI) - 主要是命令行 - 工具。例如。 Linux中的一个简单工具(适用于您的PDF!)pdftotext(如果您希望保留在Python中,可以使用subprocess call来调用它,或者即使是os.system

在此之后,您将获得一个文本文件,只需使用基本的Python字符串函数或正则表达式或PyParser等复杂的内容即可轻松处理。

答案 1 :(得分:0)

找到适合我的方式。

url = 'http://www.arch.gob.ec/index.php/descargas/doc_download/478-historial-de-produccion-nacional-de-crudo-2011.html'

(pdfFile, headers) = urllib.request.urlretrieve(url)
print(os.path.abspath(pdfFile))
s = pdf_convert(str(os.path.abspath(pdfFile)))

其中pdf_convert是:

def pdf_convert(path):
outtype='txt'
opts={}
# Create file that that can be populated in Desktop
outfile = 'c:\\users\\yourusername\\Desktop\\temp2.txt'
outdir = '/'.join(path.split('/')[:-1])
# debug option
debug = 0
# input option
password = ''
pagenos = set()
maxpages = 0
# output option
# ?outfile = None
# ?outtype = None
outdir = None
#layoutmode = 'normal'
codec = 'utf-8'
pageno = 1
scale = 1
showpageno = True
laparams = LAParams()
for (k, v) in opts:
    if k == '-d': debug += 1
    elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') )
    elif k == '-m': maxpages = int(v)
    elif k == '-P': password = v
    elif k == '-o': outfile = v
    elif k == '-n': laparams = None
    elif k == '-A': laparams.all_texts = True
    elif k == '-V': laparams.detect_vertical = True
    elif k == '-M': laparams.char_margin = float(v)
    elif k == '-L': laparams.line_margin = float(v)
    elif k == '-W': laparams.word_margin = float(v)
    elif k == '-F': laparams.boxes_flow = float(v)
    elif k == '-Y': layoutmode = v
    elif k == '-O': outdir = v
    elif k == '-t': outtype = v
    elif k == '-c': codec = v
    elif k == '-s': scale = float(v)
#
#PDFDocument.debug = debug
#PDFParser.debug = debug
CMapDB.debug = debug
PDFResourceManager.debug = debug
PDFPageInterpreter.debug = debug
PDFDevice.debug = debug
#
rsrcmgr = PDFResourceManager()

outtype = 'text'

if outfile:
    outfp = open(outfile, 'w')

else:
    outfp = sys.stdout
device = TextConverter(rsrcmgr, outfp, laparams=laparams)


fp = open(path, 'rb')
process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password,
                check_extractable=True)
fp.close()
device.close()
outfp.close()
with open ('c:\\users\\studma~1\\Desktop\\temp2.txt', 'r') as myfile:
    data = myfile.read()
myfile.close()
return str(data)