在循环中创建url



我正在尝试使用for循环创建url列表。它打印所有正确的url,但没有将它们保存在列表中。最后,我想使用urlretrieve下载多个文件。

for i, j in zip(range(0, 17), range(1, 18)):
if i < 8 or j < 10:
url = "https://Here is a URL/P200{}".format(i) + "-0{}".format(j) + ".xls"
print(url)
if i == 9 and j == 10:
url = "https://Here is a URL/P200{}".format(i) + "-{}".format(j) + ".xls"
print(url)
if i > 9:
if i > 9 or j < 8:
url = "https://Here is a URL/P20{}".format(i) + "-{}".format(j) + ".xls"
print(url)

以上代码的输出为:

https://Here is a URL/P2000-01.xls
https://Here is a URL/P2001-02.xls
https://Here is a URL/P2002-03.xls
https://Here is a URL/P2003-04.xls
https://Here is a URL/P2004-05.xls
https://Here is a URL/P2005-06.xls
https://Here is a URL/P2006-07.xls
https://Here is a URL/P2007-08.xls
https://Here is a URL/P2008-09.xls
https://Here is a URL/P2009-10.xls
https://Here is a URL/P2010-11.xls
https://Here is a URL/P2011-12.xls
https://Here is a URL/P2012-13.xls
https://Here is a URL/P2013-14.xls
https://Here is a URL/P2014-15.xls
https://Here is a URL/P2015-16.xls
https://Here is a URL/P2016-17.xls

但这:

url

只给:

'https://Here is a URL/P2016-17.xls'

我如何得到所有的url,而不仅仅是最后一个?

有几件事可以显著简化您的代码。首先,这个:

"https://Here is a URL/P200{}".format(i) + "-0{}".format(j) + ".xls"

可以简化为:

"https://Here is a URL/P200{}-0{}.xls".format(i, j)

如果你至少有Python 3.6,你可以使用f-string来代替:

f"https://Here is a URL/P200{i}-0{j}.xls"

其次,Python有几种方法可以方便地用零填充数字;它甚至可以作为f字符串格式化的一部分来完成。另外,range默认从零开始。

那么你的整个原始代码相当于:

for num in range(17):
print(f'https://Here is a URL/P20{num:02}-{num+1:02}.xls')

现在,您需要实际使用这些url,而不仅仅是将它们打印出来。您提到了创建一个列表,可以这样做:

urls = []
for num in range(17):
urls.append(f'https://Here is a URL/P20{num:02}-{num+1:02}.xls')

或者带列表推导式:

urls = [f'https://Here is a URL/P20{num:02}-{num+1:02}.xls'
for num in range(17)]

根据你在这里的评论和你的其他问题,你似乎对你需要这些url的形式感到困惑。像这样的字符串已经是您需要的urlretrieve接受URL作为字符串,因此您不需要做任何进一步的处理。参见文档中的示例:

local_filename, headers = urllib.request.urlretrieve('http://python.org/')
html = open(local_filename)
html.close()

然而,出于两个原因,我建议不要使用urlretrieve

  1. 正如文档所提到的,urlretrieve是一个遗留方法,可能会被弃用。如果您打算使用urllib,请使用urlopen方法。

  2. 然而,正如Paul Becotte在回答你的另一个问题时提到的:如果你想获取url,我建议安装和使用请求而不是urllib

无论选择哪种方法,字符串都可以。下面是使用请求将每个指定的电子表格下载到当前目录的代码:

import requests
base_url = 'https://Here is a URL/'
for num in range(17):
filename = f'P20{num:02}-{num+1:02}.xls'
xls = requests.get(base_url + filename)
with open(filename, 'wb') as f:
f.write(xls.content)

您正在用最终URL重写URL的结果。您需要维护一个最终列表,并不断向列表

添加新值
import urllib.parse
url=[];
for i,j in zip(range(0,17),range(1,18)):
if(i<8 or j<10):
url.append("https://Here is a URL/P200{}".format(i)+"-0{}".format(j)+".xls")
if(i==9 and  j==10):
url.append("https://Here is a URL/P200{}".format(i)+"-{}".format(j)+".xls") 
if(i>9):
if((i>9) or (j<8)):
url.append("https://Here is a URL/P20{}".format(i)+"-{}".format(j)+".xls")
for urlValue in url:
print(urllib.parse.quote(urlValue))

最新更新