簡體   English   中英

使用 URL Python 3 TypeError 抓取網頁 pdf

[英]Web scraping pdf using URL Python 3 TypeError

我正在嘗試編寫從 URL 下載 PDF 的代碼。 我找到了一種這樣做的方法,但它不是用 Python 3 編寫的,而是使用了file()函數。

我嘗試在fp = open(path, 'rb')行中用open()替換它。

但是我收到這個錯誤:

TypeError: expected str, bytes or os.PathLike object, not HTTPResponse.

我在網上找不到解決方案。 任何幫助將不勝感激。 這是代碼:

import bs4 as bs
import urllib.request
from urllib.request import urlopen
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.pdfpage import PDFPage
from pdfminer.layout import LAParams
from io import StringIO
from io import open

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)
    fp.close()
    device.close()
    stri = retstr.getvalue()
    retstr.close()
    return stri

pdfFile = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf");
outputString = convert_pdf_to_txt(pdfFile)

print(outputString)
pdfFile.close()

使用的資源

http://zempirians.com/ebooks/Ryan%20Mitchell-Web%20Scraping%20with%20Python_%20Collecting%20Data%20from%20the%20Modern%20Web-O'Reilly%20Media%20 (2015).pdf(第101頁)

在python中使用PDFMiner從PDF文件中提取文本? (最佳答案)

這樣做(您需要從 HTTP 響應對象中獲取字節):

pdfResponse = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf");
outputString = convert_pdf_to_txt(pdfResponse.read())

https://docs.python.org/3/library/http.client.html#httpresponse-objects

但是你必須修改你的convert_pdf_to_txt函數以將原始數據作為輸入而不是文件對象,即,而不是

def convert_pdf_to_txt(path):
   fp = open(path, 'rb')
   ...
   for page in PDFPage.get_pages(fp, ...)

你必須這樣做:

def convert_pdf_to_txt(rawbytes):
    import io
    fp = io.BytesIO(rawbytes)
    ...
    for page in PDFPage.get_pages(fp, ...)

io.BytesIO可幫助您將字節數據轉換為類似文件的字節流 ( https://docs.python.org/3/library/io.html#binary-io ),以便您之后可以將其偽裝為文件。

我之前沒有玩過PDF庫,但你可以從這個方向開始。

與其與過時版本的pdfminer斗爭,我建議使用pdfminer.six ,它是與 Python 3 兼容的pdfminer庫的最新分支。

pip install pdfminer.six

您將不得不編輯一些import語句,但在大多數情況下,較新的 fork 是一個替代品。

所以,現在,在閱讀了 HTTP 響應的正文之后(按照 Adrian Tam 的建議),您已經獲得了一個 PDF 對象。 然后,您可以使用該對象作為參數調用您的轉換方法:

def convert_pdf_to_txt(pdf_obj):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    fp = BytesIO(pdf_obj)  #get a file-like binary object
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)
    fp.close()
    device.close()
    stri = retstr.getvalue()
    retstr.close()
    print(stri)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM