2010-09-03 83 views
4

我有,我下載歐洲議會網站PDF在給定的立法建議下面的示例代碼:轉換一個PDF文本/ HTML,所以我可以解析它

編輯:我結束了剛剛起步鏈接,並將其輸送到磚坯在線轉換工具(請參見下面的代碼):

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文件轉換成蟒蛇爲文本,所以我可以解析爲信息文本關於立法程序。任何人都可以解釋我如何做到這一點?

托馬斯

+0

[插入有關'進口*'這裏標準的投訴] – katrielalex 2010-09-03 16:52:26

+0

我知道關於污染名字空間標準的投訴,但在上述情況下是似乎是一個非常理論的投訴;) – 2010-09-03 18:15:08

回答

2

這不完全是魔法。我建議

  • 下載PDF文件到一個臨時目錄,
  • 呼喚外部程序文本中提取成(TEMP)的文本文件,
  • 閱讀的文本文件。

對於文本提取命令行實用程序,您有a number of possibilities,並且可能有其他鏈接(可能是基於Java的)中未提及的其他文件。先試試看看它們是否符合你的需求。也就是說,分別嘗試每一步(找到鏈接,下載文件,提取文本),然後將它們拼湊在一起。撥打電話時,請使用subprocess.Popensubprocess.call()

+0

感謝您的答案。最後,我選擇了使用Adobe在線轉換工具(請參閱上面的代碼)。對我來說 – 2010-09-07 09:48:29

3

你檢查出PDFMiner

+0

我看看它,但我很難搞清楚如何在我的python腳本中實現它。任何示例代碼將不勝感激:) – 2010-09-03 18:13:56

+0

有http://www.unixuser.org/~euske/python/pdfminer/programming.html - 這似乎並不難發現... – loevborg 2010-09-03 18:23:11

+0

我已閱讀此,但我還是新來的python,所以我不知道在網站上顯示的例子如何將PDF轉換爲HTML /文本(我也閱讀了http://denis.papathanasiou.org/?p=343的例子,這讓我感到困惑)。 – 2010-09-03 18:27:14

8

聽起來像您找到了解決方案,但如果您想要在沒有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)')] 
+0

對於我的PDF解析問題,pdfquery是一個很好的答案。我最近的問題是從PDF表單獲取字段條目,工作起來就像一個魅力。一個堅實的+1給你@JackCushman! – rikb 2017-01-03 21:23:22

相關問題