这是事情,我正在做一个从不同网站下载文件的脚本。问题是,我无法弄清楚为什么它会抛出我这个错误,而如果我把相同的URL放在我的浏览器上它让我下载文件。还有其他网址可以正常工作。所以......这是代码:
import os
from bs4 import BeautifulSoup
import time
import urllib2
f = urllib2.Request(url)
f.add_header('User-Agent', 'Mozilla/5.0 Windows NT 6.3; WOW64; rv:34.0')
request = urllib2.urlopen(f)
data = request.read()
soup = BeautifulSoup(data, 'html.parser')
p_name = soup.find('h2', id="searchResults").contents[0]
if not os.path.exists(p_name):
os.makedirs(p_name)
for a in soup.find_all('a', href="#register"):
f = a["data-durl"]
#Following two lines just prepares file name
n = len(f.split("/"))
n_file = f.split("/")[n-1]
path_file = p_name+"\\"+n_file
if os.path.isfile(path_file):
print "Firmware already downloaded. skipping it"
else:
print "Downloading "+ path_file
link = urllib2.urlopen(f)
datos = link.read()
#print "[+] Downloading firmware %s" % n_file
#n_archivo = "Archivo"+str(b)+".zip"
with open(path_file, "wb") as code:
code.write(datos)
time.sleep(2)
此网址不适用于此脚本:Non working url 但是这个工作得很好working url
希望你能帮助我。
编辑:我添加了我用于此的库。 和堆栈跟踪 我发现了错误!!问题是它尝试下载的文件名称上的空格。使用f.replace(“”,“%20”)应该可以正常工作:)
答案 0 :(得分:1)
您需要将文件名中的空格转换为空格的URL编码:%20
。为此,您可以使用str.replace()
:
print "Downloading "+ path_file
f = f.replace(' ', '%20')
link = urllib2.urlopen(f)
这将从网址下载:
http://www.downloads.netgear.com/files/GDC/ME101/ME101%20Software%20Utility%20Version%202.0.zip
而不是
http://www.downloads.netgear.com/files/GDC/ME101/ME101 Software Utility Version 2.0.zip
无效,因为它包含空格。
此网址仍可在您的浏览器中使用,因为当您输入带空格的网址时,您的浏览器会自动将其转换为%20
。