Python如何讀取PDF文檔(或TXT)
如何讀取PDF文檔(或TXT)
字符串在Python內(nèi)部的表示是Unicode編碼,首先我們來認(rèn)識Python中encode()和decode()的作用與區(qū)別:
在做編碼轉(zhuǎn)換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
- decode的作用是將其他編碼的字符轉(zhuǎn)換成unicode編碼,如str1,decode(‘gb2312’),表示將gb2312編碼的字符串str1轉(zhuǎn)換成unicode編碼。
- encode的作用是將unicode編碼轉(zhuǎn)換成其他編碼的字符串,如str2,encode(‘gb2312’),表示將unicode編碼的字符串str2轉(zhuǎn)換成gb2312編碼。
常見文檔讀取有:
- TXT
其中TXT文檔的讀取較為簡單,爬取網(wǎng)頁數(shù)據(jù)時注意read()的編碼設(shè)置即可
我們主要來介紹使用pdfminer3k模塊讀取PDF
文檔PDF的Python讀取
——英文PDF文件支持最好且只支持英文PDF是pyPDF2庫
——而對于多語言PDF文件支持最好的則是pdfminer,我們這里就使用pdfminer3k庫來實現(xiàn)讀取PDF。
1. 安裝pdfminer3k:
——pip install pdfminer3k
——python setup.py install`在這里插入代碼片`
2. 驗證安裝pdfminer3k是否成功:
在cmd下,進(jìn)入tools目錄下( cd ~/Downloads/pdfminer3k-1.3.1/tools)后使用命令 ——python3 pdf2txt.py ../samples/simple1.pdf #..是退回上一層目錄的意思
3. Python讀取PDF文檔:
pdfminer3k中類的關(guān)系:
讀取流程
——打開pdf文檔的文件對象:
fp = open("naacl06-shinyama.pdf", 'rb') #本地文檔 fp = urlopen('https://www.tencent.com/zh-cn/articles/802741466496787.pdf') #在線pdf
——創(chuàng)建文檔分析器(解析器):
pdf_parser = PDFParser(fp) #傳入pdf,從中獲取數(shù)據(jù)
——創(chuàng)建文檔對象,保存獲取的數(shù)據(jù):
pdf_doc = PDFDocument() #保存獲取的數(shù)據(jù),和PDFParser是相互關(guān)聯(lián)的
——連接分析器和文檔對象:
pdf_parser.set_document(doc) doc.set_parser(pdf_parser)
——判斷文件是否允許文本提?。?/p>
if not doc.is_extractable: raise PDFTextExtractionNotAllowed #raise如果拋出異常,后續(xù)語句不執(zhí)行
——對文檔對象提供密碼(password)初始化,沒有就不用傳該參數(shù):
doc.initialize("")
——創(chuàng)建資源管理器:
resource = PDFResourceManager() #用于存儲共享資源,如字體或圖像
——創(chuàng)建參數(shù)分析器:
laparam = LAParams()
——創(chuàng)建一個頁面聚合器對象:
device = PDFPageAggregator(resource, laparams=laparam)
——創(chuàng)建一個頁面解析器對象來處理頁面內(nèi)容:
interpreter = PDFPageInterpreter(resource, device) #傳入的是頁面資源和聚合器對象
——獲取page列表:
doc.get_pages()
——使用頁面解釋器來讀?。?/p>
interpreter.process_page(page)
——使用頁面聚合器獲得內(nèi)容:
layout = device.get_result() #這里layout是一個LTPage對象 里面存放著 這個page解析出的各種對象
——循環(huán)遍歷取出聚合器獲得的對象內(nèi)容:
for out in layout: if hasattr(out, 'get_text'): #判斷out對象是否具有g(shù)et_text方法 print(out.get_text()) #輸出out對象
Layout布局分析返回的PDF文檔中的每個頁面LTPage對象。
這個對象和頁內(nèi)包含的子對象,形成一個樹結(jié)構(gòu)。
如圖所示:
樹結(jié)構(gòu)節(jié)點含義:
節(jié)點 | 含義 |
---|---|
LTPage | 表示整個頁??赡軙蠰TTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子對象 |
LTTextBox | 表示一組文本塊可能包含在一個矩形區(qū)域。注意此box是由幾何分析中創(chuàng)建,并且不一定表示該文本的一個邏輯邊界。它包含LTTextLine對象的列表。使用 get_text()方法返回文本內(nèi)容 |
LTTextLine | 包含表示單個文本行LTChar對象的列表。字符對齊要么水平或垂直,取決于文本的寫入模式。使用get_text()方法返回文本內(nèi)容 |
LTAnno | 在文本中字母實際上被表示為Unicode字符串。需要注意的是,雖然一個LTChar對象具有實際邊界,LTAnno對象沒有,因為這些是“虛擬”的字符,根據(jù)兩個字符間的關(guān)系(例如,一個空格)由布局分析后插入 |
LTImage | 表示一個圖像對象。嵌入式圖像可以是JPEG或其它格式,但是目前PDFMiner沒有放置太多精力在圖形對象 |
LTLine | 代表一條直線。可用于分離文本或附圖 |
LTRect | 表示矩形。可用于框架的另一圖片或數(shù)字。 |
LTCurve | 表示一個通用的Bezier曲線 |
讀取PDF文檔完整實例
from urllib.request import urlopen from pdfminer.pdfparser import PDFParser, PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfdevice import PDFDevice from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams #獲取文檔 #fp = open("naacl06-shinyama.pdf", 'rb') fp = urlopen('https://www.tencent.com/zh-cn/articles/802741466496787.pdf') #創(chuàng)建解釋器 pdf_parser = PDFParser(fp) #PDF文檔對象 doc = PDFDocument() #連接解釋器和文檔對象 parser.set_document(doc) doc.set_parser(parser) #初始化文檔 doc.initialize() #創(chuàng)建PDF資源管理器 resource = PDFResourceManager() # 創(chuàng)建一個PDF參數(shù)分析器 laparam = LAParams() # 創(chuàng)建聚合器 device = PDFPageAggregator(resource, laparams=laparam) #創(chuàng)建PDF頁面解析器 interpreter = PDFPageInterpreter(resource, device) # 循環(huán)遍歷列表,每次處理一頁的內(nèi)容 # doc.get_pages() 獲取page列表 for page in doc.get_pages(): #使用頁面解釋器來讀取 interpreter.process_page(page) #使用聚合器獲得內(nèi)容 layout = device.get_result() for out in layout: if hasattr(out, 'get_text'): print(out.get_text())
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中實現(xiàn)php的var_dump函數(shù)功能
這篇文章主要介紹了python中實現(xiàn)php的var_dump函數(shù)功能,var_dump函數(shù)在PHP中調(diào)試時非常實用,本文介紹在Python中實現(xiàn)這個函數(shù),需要的朋友可以參考下2015-01-01Python數(shù)據(jù)擬合實現(xiàn)最小二乘法示例解析
這篇文章主要為大家介紹了Python數(shù)據(jù)擬合實現(xiàn)最小二乘法的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10python 求某條線上特定x值或y值的點坐標(biāo)方法
今天小編就為大家分享一篇python 求某條線上特定x值或y值的點坐標(biāo)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python3如何根據(jù)函數(shù)名動態(tài)調(diào)用函數(shù)
這篇文章主要介紹了Python3如何根據(jù)函數(shù)名動態(tài)調(diào)用函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11