使用 pypdf2 抓取一页 pdf 时不返回任何文本
No text is returned when pypdf2 is used to scrape a one paged pdf
我已经从这个来源下载了一堆 pdf:'http://ec.europa.eu/growth/tools-databases/cosing/index.cfm?fuseaction=search.detailsPDF_v2&id=28157
现在我想使用 PyPDF2 抓取 PDF,但是没有返回文本。
我用另一个 pdf 测试了代码,它没有问题。
all_files = os.listdir('C:/Users/NAME.NAME/Downloads/Eu/T/')
count=0
count2=0
for filenames in all_files:
count +=1
file_path='C:/Users/NAME.NAME/Downloads/Eu/T/'+filenames
pdf_obj=open(file_path, 'rb')
pdf_reader = PyPDF2.PdfFileReader(pdf_obj)
num_pages = pdf_reader.numPages
current_page=0
text2=""
pageObj= pdf_reader.getPage(current_page)
text2 +=pageObj.extractText()
This is because PyPDF2 is a inconsistent scraper 。您必须记住,并非所有 pdf 的构建都是相同的,因此基于构建 pdf 的结构 PyPDF2 可能会也可能不会 抓取 它。
通常当我 抓取 pdf 时,我必须在 PyPDF2、pdfminer 和 slate3k 之间切换,这取决于我是否使用 PyPDF2 获取文本。我从 PyPDF2 开始,因为在我看来它是最简单的。
我的稳健性顺序(包可以抓取 pdfs的程度):
1.) pdfminer
2.) slate3k
3.) PyPDF2
使用 slate3k:
import glob as glob
all_files = r'C:/Users/NAME.NAME/Downloads/Eu/T/*.pdf'
for filenames in glob.glob(all_files):
with open(filenames,'rb') as f:
pdf_text = slate.PDF(f)
print(text)
使用 pdfminer
import glob as glob
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = io.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)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
all_files = r'C:/Users/NAME.NAME/Downloads/Eu/T/*.pdf'
for files in glob.glob(all_files):
convert_pdf_to_txt(files)
您可能需要更改函数以获取您想要的格式的文本。正如我所说,因为 PDF 可以以多种方式构建,所以您的文本可以以多种不同的方式输出。但这应该会让您朝着正确的方向前进。
我已经从这个来源下载了一堆 pdf:'http://ec.europa.eu/growth/tools-databases/cosing/index.cfm?fuseaction=search.detailsPDF_v2&id=28157
现在我想使用 PyPDF2 抓取 PDF,但是没有返回文本。
我用另一个 pdf 测试了代码,它没有问题。
all_files = os.listdir('C:/Users/NAME.NAME/Downloads/Eu/T/')
count=0
count2=0
for filenames in all_files:
count +=1
file_path='C:/Users/NAME.NAME/Downloads/Eu/T/'+filenames
pdf_obj=open(file_path, 'rb')
pdf_reader = PyPDF2.PdfFileReader(pdf_obj)
num_pages = pdf_reader.numPages
current_page=0
text2=""
pageObj= pdf_reader.getPage(current_page)
text2 +=pageObj.extractText()
This is because PyPDF2 is a inconsistent scraper 。您必须记住,并非所有 pdf 的构建都是相同的,因此基于构建 pdf 的结构 PyPDF2 可能会也可能不会 抓取 它。
通常当我 抓取 pdf 时,我必须在 PyPDF2、pdfminer 和 slate3k 之间切换,这取决于我是否使用 PyPDF2 获取文本。我从 PyPDF2 开始,因为在我看来它是最简单的。
我的稳健性顺序(包可以抓取 pdfs的程度):
1.) pdfminer
2.) slate3k
3.) PyPDF2
使用 slate3k:
import glob as glob
all_files = r'C:/Users/NAME.NAME/Downloads/Eu/T/*.pdf'
for filenames in glob.glob(all_files):
with open(filenames,'rb') as f:
pdf_text = slate.PDF(f)
print(text)
使用 pdfminer
import glob as glob
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = io.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)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
all_files = r'C:/Users/NAME.NAME/Downloads/Eu/T/*.pdf'
for files in glob.glob(all_files):
convert_pdf_to_txt(files)
您可能需要更改函数以获取您想要的格式的文本。正如我所说,因为 PDF 可以以多种方式构建,所以您的文本可以以多种不同的方式输出。但这应该会让您朝着正确的方向前进。