python - urllib.request.urlretrieve抛出意外的异常未知的url类型:' '

时间:2017-07-07 22:52:30

标签: urllib

我正在尝试使用urllib.request.retrieve()

下载文件

我使用的是Python 3并且下载成功,但我不知道它为什么会抛出异常。

出于某种原因,它会引发异常。

这是主文件:

import os
import urllib.request

zip_file_open = open("urls.txt")

if not os.path.exists('zip'):
    os.makedirs('zip')

num=1

true = True
b = true    

for i in zip_file_open.read().splitlines():
    try:
        print(str(i))
        #response = urllib.request.urlopen(str(i))
        #print(response)
        #html = response.read()
        urllib.request.urlretrieve(i, "zip/code"+str(num)+".zip")
        if(b):
            num+=1
            b=False
        else:
            b=true
    except Exception as e:
        print("Exception: "+str(e))
        if(b):
            num+=1
            b=False
        else:
            b=true

这是urls.txt:

http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c01_code.zip
http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c02_code.zip
........
http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c25_code.zip
http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c26_code.zip

以下是我创建txt文件的方法:

f = open("urls.txt","w")

k = """http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c"""
k1 = """_code.zip"""

import os

for i in range(26):
    if(i<9):
        f.write(k+str(0)+str(i+1)+k1+os.linesep)
    else:
        f.write(k+str(i+1)+k1+os.linesep)
f.close()

这是输出

http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c01_code.zip

Exception2: unknown url type: ''
http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c02_code.zip

Exception3: unknown url type: ''
http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c03_code.zip
Exception3: HTTP Error 404: Not Found

........

Exception26: unknown url type: ''
http://media.wiley.com/product_ancillary/50/11188580/DOWNLOAD/c26_code.zip

Exception27: unknown url type: ''

我没有包含所有输出行,因为它们是相同的。代码是有用的,但我想知道我们是否可以删除异常。

1 个答案:

答案 0 :(得分:1)

您的文件中看起来有一些空白行,因此当您尝试获取urllib时,ValueError会引发''异常,这显然不是网址。
如果在循环中添加条件以检查空字符串,则可以修复此错误。

for i in zip_file_open.read().splitlines(): 
    if not i.strip(): 
        continue
    ...

但这不适用于非空网格的非空字符串,例如'not a url'
更好的方法是使用urlparse检查网址方案。

for i in zip_file_open.read().splitlines(): 
    if not urllib.parse.urlparse(i).scheme: 
        continue
    ...