【Python 第45课】查天气(3)
看一下我们通过 req.text 已经拿到的json格式的天气数据:
{
"data":{
"yesterday":{"date":"30日星期二",...,
"city":"北京",
"forecast":[{"date":"31日星期三",...,
"ganmao":"各项气象条件适宜...",
"wendu":"30"
},
"status":1000,
"desc":"OK"
}
直接在命令行中看到的应该是没有换行和空格的一长串字符,这里我把格式整理了一下,并省略了部分信息。可以看出,它像是一个字典的结构,但是有很多层。最外层有三个key--"data","status"和"desc",data的value是另一个字典,里面包含了"yesterday"和"forecast"等好几项天气信息,现在我们最关心的就是"forecast"值列中的第一项。
虽然看上去像字典,但它对于程序来说,仍然是一个字符串,只不过是一个满足json格式的字符串。我们可以直接用requests模块的json()方法,将请求得到的json格式的字符串直接转成一个真正的字典。
dic_city = req.json()
print(dic_city)
可以看到,与直接输出req.text不同,requests的json()方法不仅帮我们把json格式的数据转化成了字典,还一并帮我们把编码的问题解决了。
{'data': {'yesterday': {'date': '30日星期二', 'high': '高温 34℃', 'fx': '南风', 'low': '低温 24℃', 'fl': '<![CDATA[<3级]]>', 'type': ...
你可能会觉得json格式的字符串和字典是一样的,但如果你用type方法看一下它们的类型:
print (type(req.text))
print (type(req.json()))
就知道区别在哪里了。
之后的事情就比较容易了。首先使用字典的get方法,若城市名错误返回的字典中没有’data‘这个键,程序不会报错,而是返回 None
city_data = dic_city.get('data')
接着,分别输出查询城市当天的日期、最高温、最低温和天气类型,或者进行没有找到城市时的处理:
if city_data:
city_forecast = city_data['forecast'][0] # 下面的都可以换成'get'方法
print(city_forecast.get('date'))
print(city_forecast.get('high'))
print(city_forecast.get('low'))
print(city_forecast.get('type'))
else:
print('未获得')
另外,为了防止在请求过程中出错,我加上了一个异常处理。
try:
###
###
except:
print ('查询失败')
来源:Crossin的编程教室