如何在python中设置两个循环?

时间:2016-04-21 03:30:10

标签: python loops

您好我是python的新手,现在我正在努力学习如何抓取网站。我正在练习循环功能。这是问题

i)我正在使用天气网站获取两个数据:天气和温度。

ii)在网站的网址中,它包含日期和城市。

问题是我只能控制循环的一侧,我搜索了网站并没有找到答案。

以下是我写的代码。

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time

calday = ["01","02","03","04","05"...."31"]
citylist = ["Newyork","London","Paris"]
for i in range(len(calday)):
for i in range(len(citylist)):
    url="http://websitename.com/localeCode=en_US&complexSearchField="+citylist[i]+"&05%2F"+calday+"2F2015"   # 05%2F01%2F2015 which means 2015-05-01 and the day is replaced by "+calday+" 

    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text,'lxml')
    weathers = soup.select('.searchResultsweather')
    temps = soup.select('.searchResultstemp')
    time.sleep(2)
    for temp,weather in zip(temps,weathers):
        data = {
        "temp":temp.get_text(),
        "weather":weather.get_text()
        }
        print (data)

我知道有更好的方法来处理日期模块,但是现在我不知道如何完成两个循环并得到如下结果:

Newyork may1临时天气

Newyork may2临时天气

...

纽约可能31天气

然后采用相同的伦敦和巴黎格式。

提前致谢。

2 个答案:

答案 0 :(得分:4)

你的问题在这里:

for i in range(len(calday)):
    for i in range(len(citylist)):

您在两个循环中使用相同的循环变量(i)。使用更具描述性的名称,它将被修复:

for dayidx in range(len(calday)):
    for cityidx in range(len(citylist)):

但更好的是,您根本不需要进行数字索引。只需迭代列表中的值:

for day in calday:
    for city in citylist:
        url = "http://websitename.com/localeCode=en_US&complexSearchField="+city+"&05%2F"+day+"2F2015"

答案 1 :(得分:1)

你应该修改你的缩进并在这里放置不同的变量:

for i in range(len(calday)):
for i in range(len(citylist)):

更改为

for i in range(len(calday)):
   for j in range(len(citylist)): #note the j here

Python是一种使用缩进作为块的语言。如果您对calday和citylist使用相同的变量,则无法单独访问它们。