我正在尝试从网站下载 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)
来自 the document :
You can also access the response body as bytes, for non-text requests:
>>> r.content b'[{"repository":{"open_issues":0,"url":"https://github.com/...
这意味着:response.text
将输出作为字符串对象返回,在下载文本文件 时使用它。如HTML文件等
并且 response.content
将输出作为字节对象返回,当您下载 二进制文件 时使用它。如PDF文件、音频文件、图片等
You can also use response.raw
instead .但是,当您要下载的文件很大时使用它。下面是一个基本示例,您也可以在文档中找到它:
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
是您要使用的 block 大小。如果您将其设置为 2000
,则 requests 将下载该文件的前 2000
个字节,将它们写入文件中,然后一遍又一遍地执行此操作,除非它完成.
所以这可以节省您的 RAM。但在这种情况下,我更喜欢使用 response.content
,因为您的文件很小。如您所见,使用 response.raw
很复杂。
相关:
关于python - 使用 Python requests 模块下载并保存 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503412/