目前用的最多的数据格式:json 和 xml。
Python 中操作 XML 有两种方式:DOM 和 SAX。
- DOM 会把整个 XML 读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。
- SAX 是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。
正常情况下,优先考虑 SAX,因为 DOM 实在太占内存。
在 Python 中使用 SAX 解析 XML 非常简洁,通常我们关心的事件是 start_element,end_element 和 char_data,准备好这 3 个函数,然后就可以解析 xml 了。
实例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' 内建模块—xml '
__author__ = 'Kevin Gong'
from xml.parsers.expat import ParserCreate
from urllib import request
class WeatherSaxHandler(object):
weather = {'city' : 1,'cityname' : [],'forecast' : []}
def start_element(self, name, attrs):
if name == 'yiyang':
self.weather['city'] = '益阳'
if name == 'city':
# 获取地区名
self.weather['cityname'].append(attrs['cityname'])
# 获取 forecast 信息
self.weather['forecast'].append({
'state':attrs['stateDetailed'],
'high':attrs['tem2'],
'low':attrs['tem1']
})
def parseXml(xml):
handler = WeatherSaxHandler()
parser = ParserCreate()
parser.StartElementHandler = handler.start_element
parser.Parse(xml)
print('城市:%s'% (handler.weather['city']))
for (x, y) in zip(handler.weather['cityname'],handler.weather['forecast']):
print('地区:%s' % x)
print(y)
return handler.weather
# test
URL = 'http://flash.weather.com.cn/wmaps/xml/yiyang.xml'
with request.urlopen(URL,timeout=4) as f:
data = f.read()
result = parseXml(data.decode('utf-8'))
结果:
城市:益阳
地区:南县
{'state': '小雨转中雨', 'high': '23', 'low': '26'}
地区:沅江市
{'state': '小雨转暴雨', 'high': '23', 'low': '27'}
地区:益阳市
{'state': '小雨转大雨', 'high': '23', 'low': '27'}
地区:桃江县
{'state': '小雨转大雨', 'high': '23', 'low': '27'}
地区:安化县
{'state': '中雨转大雨', 'high': '21', 'low': '25'}