Преобразование PDF в текст / HTML в Python, чтобы я мог разобрать его - PullRequest
4 голосов
/ 03 сентября 2010

У меня есть следующий пример кода, где я загружаю 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, чтобы я мог проанализировать текст для получения информации о законодательной процедуре.Может кто-нибудь объяснить мне, как это можно сделать?

Томас

Ответы [ 3 ]

10 голосов
/ 17 апреля 2012

Звучит так, как будто вы нашли решение, но если вы когда-нибудь захотите сделать это без веб-службы или вам нужно собрать данные, исходя из их точного расположения на странице PDF, могу ли я предложить свою библиотеку, pdfquery ? По сути, он превращает PDF в дерево lxml, которое можно выложить в виде XML или проанализировать с помощью 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)')]
3 голосов
/ 03 сентября 2010

Вы проверили PDFMiner ?

2 голосов
/ 03 сентября 2010

Это не совсем волшебство.Я предлагаю

  • загрузить файл PDF во временный каталог,
  • вызвать внешнюю программу для извлечения текста в (временный) текстовый файл,
  • чтение текстового файла.

Для утилит командной строки для извлечения текста у вас есть ряд возможностей , и могут быть другие, не упомянутые в ссылке (возможно, на основе Java).Сначала попробуйте их, чтобы увидеть, соответствуют ли они вашим потребностям.То есть, попробуйте каждый шаг отдельно (поиск ссылок, загрузка файлов, извлечение текста), а затем соедините их вместе.Для вызова используйте subprocess.Popen или subprocess.call().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...