您好我是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天气
然后采用相同的伦敦和巴黎格式。
提前致谢。
答案 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使用相同的变量,则无法单独访问它们。