【问题标题】:Can't make my script print output in the desired format无法使我的脚本以所需格式打印输出
【发布时间】:2019-08-04 06:07:09
【问题描述】:

我正在尝试从 pdf 文件中提取特定部分的文本。我已经使用PyPDF2 库来做到这一点。但是,当我执行下面的脚本时,我可以看到我希望抓取的内容正在笨拙地打印在控制台中。

到目前为止我已经写了:

import io
import PyPDF2
import requests

URL = 'http://www.ct.gov/hix/lib/hix/CT_DSG_-12132014_version_1.2_%28with_clarifications%29.pdf'

res = requests.get(URL)
f = io.BytesIO(res.content)
reader = PyPDF2.PdfFileReader(f)
contents = reader.getPage(0).extractText()
print(contents)

我的输出:

ACCESSHEALTHCTConnecticutAllPayersClaimsDatabaseDATASUBMISSIONGUIDE
December5,2013
Version1.2(withclarifications)

我想抓取的输出如下:

ACCESS HEALTH CT
Connecticut All Payers Claims Database
DATA SUBMISSION GUIDE
December 5, 2013
Version 1.2 (with clarifications)

【问题讨论】:

  • 用错误的字符串调用 repr() 并打印它返回的内容。这可能会向您展示字符串中真正包含的内容。喜欢print('contents =',repr(contents))
  • 这就是我称之为'ACCESSHEALTHCTConnecticutAllPayersClaimsDatabaseDATASUBMISSIONGUIDE\nDecember5,2013\nVersion1.2(withclarifications)'时产生的结果
  • 嗨@Tarun,很高兴再次找到你。问题是,如果可以产生所需的输出,我很乐意去使用任何库。但是,重要的是我是否可以在我的机器上安装和运行它。非常感谢。
  • 在我发布的链接中,您可以下载二进制文件并从您的代码中调用,而不是依赖库,输出将是您想要的结果

标签: python python-3.x web-scraping pypdf2


【解决方案1】:

这是 pyPDF2 的问题,原因是 PyPDF 不读取换行符。或者你可以pdftotext

简单而干净,您可以循环页面或提取一页。

import io
import requests
import pdftotext
URL = 'http://www.ct.gov/hix/lib/hix/CT_DSG_-12132014_version_1.2_%28with_clarifications%29.pdf'
res = requests.get(URL)
f = io.BytesIO(res.content)
pdf = pdftotext.PDF(f)
print(pdf[0])
# Iterate over all the pages
# for page in pdf:
#     print(page)

【讨论】:

  • 这正是我想要的输出,但问题是我无法使用pip install pdftotext 安装库。我正在使用 python 3.7.0。
  • 因为你在这里错过了依赖sudo apt-get install build-essential libpoppler-cpp-dev pkg-config python-dev
  • 你可以查看官方文档,明确提到这些sudo apt-get update && sudo apt-get install build-essential libpoppler-cpp-dev pkg-config python-dev
  • 我正在使用 Windows,这就是无法以这种方式安装库的原因。但是,我使用subprocess 打开它,但不能以正确的方式使用它。在这里查看the script。我现在如何使用它?谢谢。
【解决方案2】:

如果安装其他软件包会导致依赖问题,我建议PDFMiner

您可以通过 pip install pdfminer.six 为 python 3.7 安装它,我已经测试过它可以在我的 python 3.7 上运行。

获取页面0的代码如下

import io
import requests
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser

URL = 'http://www.ct.gov/hix/lib/hix/CT_DSG_-12132014_version_1.2_%28with_clarifications%29.pdf'

res = requests.get(URL)
fp = io.BytesIO(res.content)

rsrcmgr = PDFResourceManager()
retstr = io.StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)

page_no = 0
for pageNumber, page in enumerate(PDFPage.get_pages(fp)):
    if pageNumber == page_no:
        interpreter.process_page(page)

        data = retstr.getvalue()

print(data.strip())

输出

ACCESS HEALTH CT 

Connecticut All Payers Claims Database 

DATA SUBMISSION GUIDE 

December 5, 2013 

Version 1.2 (with clarifications) 

PDFMiner 的好处在于它可以直接读取您的页面,并且完全专注于获取和分析文本数据。

【讨论】:

  • 是的,它完美地完成了这项工作。您能否提供我可以了解更多有关此“PDFMiner”的任何链接?谢谢。
  • @robots.txt 他们写了一个PDF 关于它。然而它很长。如果您想了解有关 PDF 及其工作原理的更多信息,您可以阅读它,但如果您想要通用代码,您可以在 SO 上搜索它或只是谷歌它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多