Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python请求模块下载并保存PDF文件_Python_Python 2.7_Python Requests - Fatal编程技术网

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

使用Python请求模块下载并保存PDF文件,python,python-2.7,python-requests,Python,Python 2.7,Python Requests,我正在尝试从网站下载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: ...:

我正在尝试从网站下载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)
   ...: 
[1]中的
:导入请求
在[2]中:url=http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
在[3]中:response=requests.get(url)
在[4]中:以open('/tmp/metadata.pdf',wb')作为f:
…:f.write(response.text)
---------------------------------------------------------------------------
UnicodeEncodeError回溯(最近一次呼叫最后一次)
在()
1将open('/tmp/metadata.pdf',wb')作为f:
---->2 f.编写(响应.文本)
3.
UnicodeEncodeError:“ascii”编解码器无法对位置11-14中的字符进行编码:序号不在范围内(128)
在[5]中:导入编解码器
[6]中:使用codecdes.open('/tmp/metadata.pdf',wb',encoding='utf8')作为f:
…:f.write(response.text)
...: 

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

您应该使用
响应。在这种情况下,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
将输出作为bytes对象返回,在下载二进制文件时使用它。例如PDF文件、音频文件、图像等


。但是,当您要下载的文件很大时,请使用它。以下是您也可以在文档中找到的基本示例:

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\u size
是要使用的块大小。如果将其设置为
2000
,则请求将下载该文件的第一个
2000
字节,并将其写入该文件,然后一次又一次地执行此操作,除非完成

这样可以节省你的内存。但是我更喜欢在这种情况下使用
response.content
,因为您的文件很小。如您所见,使用
响应。原始
非常复杂


涉及:


关于Kevin在文件夹
tmp
中写入的答案,应该是这样的:

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

他在地址之前忘记了
,当然你的文件夹
tmp
应该已经在Python 3中创建了,我发现pathlib是最简单的方法。Request的response.content与pathlib的write_字节完美结合

from pathlib import Path
import requests
filename = Path('metadata.pdf')
url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
response = requests.get(url)
filename.write_bytes(response.content)

请注意我是初学者。如果我的解决方案错误,请随时更正和/或让我知道。我也可能学到一些新东西

我的解决方案:

相应地将下载路径更改为要保存文件的位置。您也可以随意使用绝对路径

将以下文件另存为downloadFile.py

用法:
python downloadFile.py用于下载新文件名的文件的url。扩展名

记住添加扩展名

用法示例:
python downloadFile.pyhttp://www.google.co.uk google.html

import requests
import sys
import os

def downloadFile(url, fileName):
    with open(fileName, "wb") as file:
        response = requests.get(url)
        file.write(response.content)


scriptPath = sys.path[0]
downloadPath = os.path.join(scriptPath, '../Downloads/')
url = sys.argv[1]
fileName = sys.argv[2]      
print('path of the script: ' + scriptPath)
print('downloading file to: ' + downloadPath)
downloadFile(url, downloadPath + fileName)
print('file downloaded...')
print('exiting program...')
您可以使用urllib:

import urllib.request
urllib.request.urlretrieve(url, "filename.pdf")

一般来说,这应该在Python3中起作用:

import urllib.request 
..
urllib.request.get(url)
记住,在Python2之后,urllib和urllib2不能正常工作

如果在某些神秘的情况下请求不起作用(发生在我身上),您也可以尝试使用

wget.download(url)
相关的:

以下是在网页上查找和下载所有pdf文件的合理解释/解决方案:


1-凯文没有想到要在
tmp
中写作,就像在OP的问题中一样。2.
/tmp
目录是Unix系统中的tmp,位于
/tmp
,无
,谢谢您发布此信息。最初的问题是Python2.7,但我已经继续,现在使用Python3。我不知道pathlib库[版本3.4中新增]的情况,并将其纳入我当前的项目中。它提供了
544
,文件已损坏,有什么想法吗?@ahbon,你是什么意思?酷,谢谢你提供有关response的更多信息。raw.Pawel,谢谢你的回答。当我第一次发布这个问题时,我是一个Python新手。现在我非常熟悉这门语言。wget或curl等实用工具可以涵盖编写Python脚本从命令行下载文件的用例。此外,您的函数downloadFile as post似乎在调用自身。您是否打算缩进第二段代码?在stackoverflow中,您可以通过取消凹痕来纠正此问题。我还建议您看看Python的argparse库。您可以使用它来创建漂亮的命令行实用程序。它将为您处理参数。我非常喜欢您使用上下文管理器(具有open…as file:,等等)来处理文件写入。你的代码写得很整齐。您正走在学习Python的良好道路上。祝你好运谢谢你的回复,@Jim!我编辑了这篇文章,事实上,我并没有“打算缩进”:D程序的主要部分。谢谢你的建议!:)这是最好的,tbh。这是最好的
urlretrieve
依赖于全局设置来确定请求头,这使得它不适合某些用例。