Python 学习之常用内建模块(XML)

目前用的最多的数据格式: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'}

猜你喜欢

转载自blog.csdn.net/duoduo_11011/article/details/106506190