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'}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章