练习
Topic source我的方法,定义一个下标,当遇到<cast>时自增1
# 导入模块
import xml.sax
from urllib import request
class WeatherHandler(xml.sax.ContentHandler):
def __init__(self):
self.currentdata = ''
self.province = ''
self.date = ''
self.daytemp = ''
self.nighttemp = ''
# 定义下标
self.number = -1
# 定义返回的字典
self.weather_dict = {
'city': '',
'forecast': [
{
'date': '',
'high': '',
'low' : ''
},
{
'date': '',
'high': '',
'low' : ''
},
{
'date': '',
'high': '',
'low' : ''
},
{
'date': '',
'high': '',
'low' : ''
}
]
}
# 定义开始处理事件
def startElement(self,name,attrs):
self.currentdata = name
if self.currentdata == 'cast':
self.number += 1
# 定义标签处理标签直接内部文本事件 text为标签之间的文本
def characters(self,text):
if self.currentdata == 'province':
self.weather_dict['city'] = text
if self.currentdata == 'date':
self.weather_dict['forecast'][self.number]['date'] = text
elif self.currentdata == 'daytemp':
self.weather_dict['forecast'][self.number]['high'] = text
elif self.currentdata == 'nighttemp':
self.weather_dict['forecast'][self.number]['low'] = text
# 定义标签结尾事件即遇到</str>
def endElement(self,name):
pass
def weather_return(self):
return self.weather_dict
def parseXml(xml_str):
H = WeatherHandler()
xml.sax.parseString(xml_str,H)
weather = H.weather_return()
return weather
# 获取天气xml
citycode = '110101'
key = "Your key"
URL = "https://restapi.amap.com/v3/weather/weatherInfo?extensions=all&output=XML&city=%s&key=%s" %(citycode,key)
with request.urlopen(URL,timeout=4) as f:
data = f.read()
result = parseXml(data.decode('utf-8'))
print(result)
assert result['city'] == '北京'
# 交作业,使用dom方式解析
# 导入模块
import xml.dom.minidom
from urllib import request
def parseXml(xml_str):
#print(xml_str)
# 使用parseString得到文档对象
weather_document = xml.dom.minidom.parseString(xml_str)
# 通过标签'province'得到city信息
city = weather_document.getElementsByTagName('province')[0].firstChild.data
# 通过标签'cast'得到文档信息,组成列表,本次天气预报有4个'cast'标签
casts = weather_document.getElementsByTagName('cast')
# 定义空列表分别用于存储日期,最高气温,和最低气温
date = []
high = []
low = []
# for遍历获取对应的日期,最高气温和最低气温
for cast in casts:
date.append(cast.getElementsByTagName('date')[0].firstChild.data)
high.append(cast.getElementsByTagName('daytemp')[0].firstChild.data)
low.append(cast.getElementsByTagName('nighttemp')[0].firstChild.data)
# 返回
return {
'city': city,
'forecast': [
{
'date': date[0],
'high': high[0],
'low' : low[0]
},
{
'date': date[1],
'high': high[1],
'low' : low[1]
},
{
'date': date[2],
'high': high[2],
'low' : low[2]
},
{
'date': date[3],
'high': high[3],
'low' : low[3]
}
]
}
if __name__ == '__main__':
# 利用高德地图获取天气信息格式为xml
citycode = '110101'
key = "Your key"
URL = "https://restapi.amap.com/v3/weather/weatherInfo?extensions=all&output=XML&city=%s&key=%s" %(citycode,key)
with request.urlopen(URL,timeout=4) as f:
weather_xml = f.read().decode('utf-8')
#print(weather_xml)
result = parseXml(weather_xml)
#print(result)
assert result['city'] == '北京'
print('ok')
- 1
xian_wen
高德地图天气查询 api 获取实时天气:
实时天气 XML 结果:
预报天气 XML 结果:
存在问题:
天气预报数据只需在
url
中添加参数extensions=all
,即可获得之后数日的天气情况,但需要改写DefaultSaxHandler
类。当前类的实现,会自动覆盖之前的天气数据,因为不同 date 各结点名称相同,以至于输出的 dict 后面的天气数据会自动覆盖前面的天气数据,最终只留下了最后一天即 17 号的天气。希望大神能帮忙改写成功。