使用Python将PDF转换为文本/HTML以便于解析

5

我有以下示例代码,其中我从欧洲议会网站上下载给定立法提案的pdf文件:

编辑:最终我只获取了链接并将其提供给Adobe的在线转换工具(请参见下面的代码):

import mechanize
import urllib2
import re
from BeautifulSoup import *

adobe = "http://www.adobe.com/products/acrobat/access_onlinetools.html"

url = "http://www.europarl.europa.eu/oeil/search_reference_procedure.jsp"

def get_pdf(soup2):
    link = soup2.findAll("a", "com_acronym")
    new_link = []
    amendments = []
    for i in link:
        if "REPORT" in i["href"]:
            new_link.append(i["href"])
    if new_link == None:
        print "No A number"
    else:
        for i in new_link:
            page = br.open(str(i)).read()
            bs = BeautifulSoup(page)
            text = bs.findAll("a")
            for i in text:
                if re.search("PDF", str(i)) != None:
                    pdf_link = "http://www.europarl.europa.eu/" + i["href"]
            pdf = urllib2.urlopen(pdf_link)
            name_pdf = "%s_%s.pdf" % (y,p)
            localfile = open(name_pdf, "w")
            localfile.write(pdf.read())
            localfile.close()

            br.open(adobe)
            br.select_form(name = "convertFrm")
            br.form["srcPdfUrl"] = str(pdf_link)
            br["convertTo"] = ["html"]
            br["visuallyImpaired"] = ["notcompatible"]
            br.form["platform"] =["Macintosh"]
            pdf_html = br.submit()

            soup = BeautifulSoup(pdf_html)


page = range(1,2) #can be set to 400 to get every document for a given year
year = range(1999,2000) #can be set to 2011 to get documents from all years

for y in year:
    for p in page:
        br = mechanize.Browser()
        br.open(url)
        br.select_form(name = "byReferenceForm")
        br.form["year"] = str(y)
        br.form["sequence"] = str(p)
        response = br.submit()
        soup1 = BeautifulSoup(response)
        test = soup1.find(text="No search result")
        if test != None:
            print "%s %s No page skipping..." % (y,p)
        else:
            print "%s %s  Writing dossier..." % (y,p)
            for i in br.links(url_regex="file.jsp"):
                link = i
            response2 = br.follow_link(link).read()
            soup2 = BeautifulSoup(response2)
            get_pdf(soup2)

在get_pdf()函数中,我希望能够在python中将pdf文件转换为文本,以便于我可以解析其中的信息来了解立法程序。有人可以告诉我如何实现吗?
Thomas

在这里插入有关“import *”的标准投诉。 - Katriel
我知道关于污染命名空间的标准抱怨,但在上述情况下,这似乎是一个非常理论化的抱怨 ;) - Thomas Jensen
这篇博客可以帮助选择最好的库。 - Deepa MG
2个回答

14
听起来你已经找到了解决方案,但是如果你想不使用Web服务来完成它,或者你需要根据PDF页面上的确切位置来抓取数据,我可以建议我的库pdfquery。它基本上将PDF转换为可以作为XML输出的lxml树,或者可以使用XPath、PyQuery或其他任何你想使用的东西进行解析。
要使用它,一旦你将文件保存到磁盘中,你可以返回pdf = pdfquery.PDFQuery(name_pdf),或者直接传入一个urllib文件对象(如果你不需要保存它)。要获取XML以用BeautifulSoup解析,你可以执行pdf.tree.tostring()
如果你不介意使用JQuery样式选择器,那么有一个带有位置扩展的PyQuery接口,可以非常方便。例如:
balance = pdf.pq(':contains("Your balance is")').text()
strings_near_the_bottom_of_page_23 = [el.text for el in pdf.pq('LTPage[page_label=23] :in_bbox(0, 0, 600, 200)')]

1
对我而言,pdfquery 是解决我的 PDF 解析问题的绝佳方案。我最近遇到的问题是从 PDF 表单中获取字段条目,这个工具非常好用。强烈对 @JackCushman 点赞! - rikb
@Jack Cushman,能否请您在代码库中添加一些示例和文档呢?对于新手来说,理解并开始使用pdfquery非常困难。 - Deepa MG
嗨,杰克,我正在使用pdfquery从PDF中提取数据,并且进展非常顺利。 现在,我想将pdfquery的XML输出转换为HTML。基本上,我正在寻找生成与原始PDF文件等效的HTML页面。 你能指导我实现这个目标吗? - Abhishek Poojary

2
这并不是魔法。我建议:
  • 把PDF文件下载到临时目录
  • 调用外部程序将文本提取到(临时)文本文件中
  • 读取文本文件。
关于文本提取的命令行实用程序,您有许多可能性,链接中可能没有提到其他程序(如基于Java的)。首先尝试它们是否适合您的需求。也就是说,将每个步骤分开尝试(查找链接,下载文件,提取文本),然后将它们组合起来。对于调用外部程序,请使用subprocess.Popensubprocess.call()

感谢您的回答。最终我选择使用Adobe在线转换工具(请参见上面的代码)。 - Thomas Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接