Python 3, cgi.parse_header



我正在尝试使用python从各个网站自动下载文件。我使用python 3.8和LinuxMint。我使用的代码在大多数情况下工作得很好,但也有一些地方我得到一个错误消息。如果我手动访问网站,我可以下载并保存有问题的文件,没有问题。在手动下载文件时,我注意到一个网站在文件名(driv_full-holdings_20210830.csv)中使用连字符,而另一个网站在文件名的末尾,在点+扩展名(SMOG_asof_20210830 .xlsx)之前放一个空格。我的预感是文件名中的连字符和空格是导致错误的原因。如何自动下载这些文件?下面是我使用的代码和生成的错误:

from urllib.request import urlopen
from urllib.request import urlretrieve
import cgi
url = "https://www.vaneck.com/etf/equity/smog/holdings/download/xlsx/"
path = ('/home/edmint/2results/holdingPen/')
remotefile = urlopen(url)
blah = remotefile.info()['Content-Disposition']
value, params = cgi.parse_header(blah)
filename = params["filename"]
urlretrieve(url, (path + filename))

TypeError                                 Traceback (most recent call last)
<ipython-input-12-da0bd24b8e15> in <module>
1 remotefile = urlopen(url)
2 blah = remotefile.info()['Content-Disposition']
----> 3 value, params = cgi.parse_header(blah)
4 filename = params["filename"]
5 urlretrieve(url, (path + filename))
~/anaconda3/lib/python3.8/cgi.py in parse_header(line)
231 
232     """
--> 233     parts = _parseparam(';' + line)
234     key = parts.__next__()
235     pdict = {}
TypeError: can only concatenate str (not "NoneType") to str

我正在尝试的另一个url是

https://www.globalxetfs.com/funds/driv/?download_full_holdings=true

和产生的错误消息是相同的。

TIA

您的问题是remotefile.info()['Content-Disposition']None,然后在尝试解析标头时将输入连接到字符串时会导致上述错误。您可能应该检查是否提供了标头:快速检查可用的标头显示Content-Disposition不存在,您可以用print(dict(remotefile.info())验证。

如果将None传递给parse_header,我们会得到完全相同的错误。

In [46]: cgi.parse_header(None)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-46-0f5409738ee2> in <module>
----> 1 cgi.parse_header(None)
~AppDataLocalProgramsPythonPython39libcgi.py in parse_header(line)
227
228     """
--> 229     parts = _parseparam(';' + line)
230     key = parts.__next__()
231     pdict = {}

打印报头的内容,我们可以看到报头没有提供:

>>> print(dict(remotefile.info()))
{'x-amz-id-2': 'w22MoEI/cjaJLgujA8A7eG8n9B5RCinHeVUMJGnk88mxrO/qW/TTuL68Ow0iRQTinytsRE1Mi7w=',
'x-amz-request-id': 'WSR5HXX9FBGTNBHZ',
'Date': 'Mon, 06 Sep 2021 02:31:20 GMT',
'Last-Modified': 'Fri, 03 Sep 2021 10:03:12 GMT',
'ETag': '"2b7d2ef6276c171712a7e5899a734f30"',
'Accept-Ranges': 'bytes',
'Content-Type': 'binary/octet-stream',
'Server': 'AmazonS3',
'Content-Length': '5740',
'Connection': 'close'}

在传递给parse_header之前必须检查头是否提供。上面的代码是在您在示例中提供的URLhttps://www.globalxetfs.com/funds/driv/?download_full_holdings=true上运行的。

最新更新