【问题标题】:Converting a pdf to text/html in python so I can parse it在 python 中将 pdf 转换为 text/html,以便我可以解析它
【发布时间】:2011-04-07 22:58:11
【问题描述】:

我有以下示例代码,我从欧洲议会网站下载了关于给定立法提案的 pdf:

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

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() 函数中,我想将 pdf 文件转换为 python 中的文本,以便我可以解析文本以获取有关立法程序的信息。谁能解释一下这是怎么做到的?

托马斯

【问题讨论】:

  • [在此处插入关于 import * 的标准投诉]
  • 我知道关于污染命名空间的标准投诉,但在上述情况下,这似乎是一个非常理论上的投诉;)
  • 这个blog可以帮助选择最好的库。

标签: python parsing pdf text


【解决方案1】:

听起来您找到了解决方案,但如果您想在没有网络服务的情况下执行此操作,或者您需要根据 PDF 页面上的精确位置抓取数据,我可以推荐我的库 pdfquery 吗?它基本上将 PDF 转换为可以作为 XML 输出的 lxml 树,或使用 XPath、PyQuery 或您想要使用的任何其他内容进行解析。

要使用它,一旦您将文件保存到磁盘,您将返回pdf = pdfquery.PDFQuery(name_pdf),或者如果您不需要保存它,则直接传入一个 urllib 文件对象。要使用 BeautifulSoup 解析 XML,您可以使用 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)')]

【讨论】:

  • 对我来说,pdfquery 是解决我的 PDF 解析问题的绝佳答案。我最近的问题是从 PDF 表单中获取字段条目,就像一个魅力。给你一个坚实的 +1 @JackCushman!
  • @Jack Cushman cam 请向存储库添加一些示例和文档。对于新生来说,理解和开始使用 pdfquery 非常忙碌。
  • 嗨,杰克,我正在使用 pdfquery 从 PDF 中提取数据,而且进展顺利。我现在想将 pdfquery 的 XML 输出转换为 HTML。基本上,我希望生成与原始 PDF 文件等效的 HTML 页面。你能指引我正确的方向来实现这一目标吗?
【解决方案2】:

这并不完全是魔法。我建议

  • 将 PDF 文件下载到临时目录,
  • 调用外部程序将文本提取到(临时)文本文件中,
  • 读取文本文件。

对于文本提取命令行实用程序,您有 a number of possibilities 并且可能还有其他未在链接中提及的工具(可能是基于 Java 的)。首先尝试它们,看看它们是否符合您的需求。也就是说,分别尝试每个步骤(查找链接、下载文件、提取文本),然后将它们拼凑在一起。呼叫请使用subprocess.Popensubprocess.call()

【讨论】:

  • 感谢您的回答。最后我选择只使用adobe在线转换工具(见上面的代码)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多