【问题标题】:Python downloading PDF with urllib2 creates corrupt documentPython 使用 urllib2 下载 PDF 会创建损坏的文档
【发布时间】:2017-04-30 00:52:06
【问题描述】:

上周我定义了一个从期刊网站下载 pdf 的函数。我使用以下方法成功下载了几个 pdf:

import urllib2
def pdfDownload(url):
    response=urllib2.urlopen(url)
    expdf=response.read()
    egpdf=open('ex.pdf','wb')
    egpdf.write(expdf)
    egpdf.close()

我尝试了这个功能:

 pdfDownload('http://pss.sagepub.com/content/26/1/3.full.pdf')

当时,这就是《心理科学》杂志上的网址的格式。 pdf下载得很好。

然后我开始编写更多代码来实际生成 URL 列表并适当地命名文件,这样我就可以一次下载大量适当命名的 pdf 文档。

当我回来合并我的两个脚本时(对不起,非技术性语言;我不是专家,只是自学了基础知识)相关期刊上的 URL 格式发生了变化。在上一个 URL 之后,您将转到 URL 为“http://journals.sagepub.com/doi/pdf/10.1177/0956797614553009”的页面。现在 pdfDownload 功能不再起作用(使用原始 URL 或新 URL)。它会创建一个无法打开的 pdf,“因为该文件不是受支持的文件类型或已损坏”。

我很困惑,似乎所有的改变都是 URL 的格式,但实际上必须改变其他东西才能导致这种情况?任何帮助将不胜感激。

【问题讨论】:

  • 请发布您的代码并明确一些 URL 以进行测试
  • @EmmaCarey,检查我编辑的解决方案;它似乎适用于新网址。

标签: python python-2.7 pdf-generation urllib2


【解决方案1】:

问题在于新 URL 指向一个网页,而不是原始 PDF。如果你打印“expdf”的值,你会得到一堆 HTML——而不是你期望的二进制数据。

我可以通过一个小的调整来让你的原始函数工作——我使用requests 库而不是 urllib2 来下载文件。 requests 似乎使用您从当前实现中获得的 html 中引用的加载器提取文件。试试这个:

import requests
def pdfDownload(url):
    response=requests.get(url)
    expdf=response.content
    egpdf=open('ex.pdf','wb')
    egpdf.write(expdf)
    egpdf.close()

如果您使用的是 Python 3,则您已经拥有 requests;如果您使用的是 Python 2.7,则需要pip install requests

【讨论】:

  • 这是正确的。那么,如果我有这个网页链接,我是否应该能够找到指向基础 PDF 文档的链接,以便生成它的副本?或者网站是否有可能完全隐藏它?我不确定这是否是“抱歉,如果不手动按“下载 pdf”,您将永远无法从该站点获取 pdf”,或者我是否仍然可以这样做?幸运的是,当我正在编写脚本时,网站发生了这种变化!
  • @EmmaCarey 如果您使用 python requests 库,您甚至不需要这样做——它会给您呈现的 PDF(在 JS 加载器之后)。我在编辑后的解决方案中发布的代码为我提取了带有新 URL 的完整 PDF。
  • 非常感谢 - 这确实有效。抱歉 - 没有看到您评论的编辑版本。
  • @EmmaCarey 很高兴听到。如果它解决了您的问题,介意接受答案吗?
  • 在我的情况下,它返回了 html 文档,其中包含指向实际 pdf 的链接。您可以从内容中获取链接并向其发出新的下载请求
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2018-12-06
  • 2014-03-24
  • 2019-08-19
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多