当前位置: 首页 > 面试题库 >

使用Python请求模块下载并保存PDF文件

公西培
2023-03-14
问题内容

我正在尝试从网站下载PDF文件并将其保存到磁盘。我的尝试因编码错误而失败,或者导致PDF空白。

In [1]: import requests

In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'

In [3]: response = requests.get(url)

In [4]: with open('/tmp/metadata.pdf', 'wb') as f:
   ...:     f.write(response.text)
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-4-4be915a4f032> in <module>()
      1 with open('/tmp/metadata.pdf', 'wb') as f:
----> 2     f.write(response.text)
      3

UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal not in range(128)

In [5]: import codecs

In [6]: with codecs.open('/tmp/metadata.pdf', 'wb', encoding='utf8') as f:
   ...:     f.write(response.text)
   ...:

我知道这是某种编解码器问题,但我似乎无法使其正常工作。


问题答案:

response.content在这种情况下,您应该使用:

with open('/tmp/metadata.pdf', 'wb') as f:
    f.write(response.content)

从文件:

对于非文本请求,您还可以字节形式访问响应主体:

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

因此,这意味着:response.text将输出作为字符串对象返回,在下载 文本文件 时使用它。如HTML文件等

response.content以字节对象返回输出,在下载 二进制文件 时使用它。如PDF文件,音频文件,图像等。

您还可以使用response.raw代替。但是,当您要下载的文件很大时,请使用它。以下是一个基本示例,您也可以在文档中找到该示例:

import requests

url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
r = requests.get(url, stream=True)

with open('/tmp/metadata.pdf', 'wb') as fd:
    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)

chunk_size是您要使用的块大小。如果将其设置为2000,则请求将下载该文件的第一个2000字节,将其写入文件,然后一次又一次地执行,除非完成。

这样可以节省您的RAM。但是response.content在这种情况下,我宁愿使用它,因为您的文件很小。如您所见,使用response.raw非常复杂。

关联:

  • 如何使用requests.py在python中下载大文件?

  • 如何使用请求下载图像



 类似资料:
  • 问题内容: 我知道获取网址非常简单,我可以获取原始响应正文并将其保存到文件中,但是对于大型文件,是否可以直接流式传输到文件?就像我要下载电影或类似的东西吗? 问题答案: 奇怪的是,请求没有什么简单的方法。您必须遍历响应并将这些块写入文件: 我通常只是使用。它可以工作,但是如果您需要使用会话或某种身份验证,那么上面的代码也可以工作。

  • 我有一些python代码,它使用请求成功地从URL下载图像,并将其保存到中。我想测试一下,它应该做什么。我使用响应来测试JSON文件的获取,但我不确定如何模拟获取文件的行为。 我假设这类似于嘲笑一个标准的响应,就像下面一样,但是我想我忽略了如何将设置为文件... 更新:在Ashafix的评论之后,我正在尝试这个(python 3): 但随后,当我正在测试的代码尝试执行我得到的请求时: 感觉几乎是对

  • 问题内容: 目的是从Internet下载文件,并从中创建文件对象或类似文件的文件,而无需使其接触硬盘驱动器。这仅是出于我的知识,想知道它是否可能或可行,尤其是因为我想看看是否可以绕过必须编写文件删除行的代码。 通常,这就是我从网络上下载内容并将其映射到内存的方式: 问题答案: 这就是我最终要做的。

  • 问题内容: 通过XHR请求下载pdf文件是否完全不可能?我知道已经有许多关于此主题的讨论,但可悲的是,我仍然对它们不满意。我正在使用AngularJs并使用其方法发出请求。它不返回任何文件下载弹出窗口。但是,如果在新的“浏览器窗口”中使用相同的URL进行点击,则会弹出一个窗口。我已经尝试了一个工作环境,并且可以正常工作,但是如果执行此操作,那么在下载弹出窗口准备就绪并出现之前,我无法显示等待的图像

  • 问题内容: 这是我的代码: 这使我可以访问csv文件。我尝试了其他方法来处理下载: 这将给csv文件一个字符串: 这将打印第一行并返回错误:_csv.Error:在未引用的字段中看到换行符 这将在每行中打印一个字母,并且不会打印出整个内容: 我的问题是:在这种情况下读取CSV文件的最有效方法是什么。以及如何下载。 谢谢 问题答案: 这应该有助于: 输出样本: 答案相关的问题: 使用此功能将csv加