sax解析xml速度快、占用記憶體小。我們只需要關注三個事件:start_element、end_element、char_data。如:當sax在解析乙個節點時python
會產生三個事件:
2.1start_element
事件,分別讀取、
2.2end_element
事件,分別讀取、
2.3char_data
事件、讀取python
補充二維字典知識:
3.1 定義二維字典 :dict_2d = , 'b': }
3.2 訪問二維字典:dict_2d['a']['a']
,結果明顯是:1
3.3 新增二維字典中屬性時可以用乙個函式來完成:
#二維字典的新增函式
defaddtwodimdict
(thedict, key_a, key_b, val):
if key_a in adic:
thedict[key_a].update()
else:
thedict.update(})
』
4. 例項:請利用sax編寫程式解析yahoo的xml格式的天氣預報,獲取當天和第二天的天氣:
#!/uer/bin/env python
#-*- coding:utf-8 -*-
#使用sax解析xml
#查詢yahoo天氣的今天和明天天氣
#宣告from xml.parsers.expat import parsercreate
#定義天氣字典、天數
weather_dict = {}
which_day = 0
#定**析類
#包括三個主要函式:start_element(),end_element(),char_data()
class
weathersaxhandler
(object):
#定義start_element函式
defstart_element
(self,name,attrs):
global weather_dict,which_day
#判斷並獲取xml文件中地理位置資訊
if name == 'yweather:location':
#將本行xml**中'city'屬性值賦予字典weather_dict中的'city'
weather_dict['city']=attrs['city']
weather_dict['country']=attrs['country']#執行結束後此時,weather_dict=
#同理獲取天氣**資訊
if name == 'yweather:forecast':
which_day +=1
#第一天天氣,獲取氣溫、天氣
if which_day == 1:
weather =
weather_dict['today']=weather#此時weather_dict出現二維字典
#weather_dict=}
#第二天相關資訊
elif which_day==2:
weather=
weather_dict['tomorrow']=weather
#weather_dict=, 'tomorrow': }
#end_element函式
defend_element
(self,name):
pass
#char_data函式
defchar_data
(self,text):
pass
defparse_weather
(xml):
handler = weathersaxhandler()
parser = parsercreate()
parser.startelementhandler = handler.start_element
parser.endelementhandler = handler.end_element
parser.characterdatahandler = handler.char_data
parser.parse(xml)
return weather_dict
#xml文件,輸出結果的資料**
#將xml文件賦值給data
data = r'''<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
yahoo! weather - beijing, cn
wed, 27 may 2015 11:00 am cst
39.91
116.39
wed, 27 may 2015 11:00 am cst
'''#例項化類
weather = parse_weather(data)
#檢查條件是否為true
assert weather['city'] == 'beijing', weather['city']
assert weather['country'] == 'china', weather['country']
assert weather['today']['text'] == 'partly cloudy', weather['today']['text']
assert weather['today']['low'] == 20, weather['today']['low']
assert weather['today']['high'] == 33, weather['today']['high']
assert weather['tomorrow']['text'] == 'sunny', weather['tomorrow']['text']
assert weather['tomorrow']['low'] == 21, weather['tomorrow']['low']
assert weather['tomorrow']['high'] == 34, weather['tomorrow']['high']
#列印到螢幕
print('weather:', str(weather))
』
5. 通過本節的學習,對python中sax對xml的解析有了簡單的了解,為以後爬蟲學習做準備。
python使用sax實現xml解析
之前在使用xml解析的時候,在網上搜了很多教程,最終沒有能按照網上的教程實現需求。所以呢,只好自己去看原始碼,在sax的 init py下看到這麼一段 1 def parse source,handler,errorhandler errorhandler 2 parser make parser ...
使用SAX解析xml檔案
解析xml檔案有好幾種方法,包括有 dom jdom sax解析 demo4j 等等 本篇主要講解sax是如何解析xml檔案的。專案結構如下 新建乙個parserutil類,繼承自defaulthandler,並重寫五個方法 startdocument startelement characters...
使用jaxp的sax方式解析xml
步驟 建立解析器工廠 根據解析器工廠建立解析器 執行parse操作 建立乙個類,繼承defaulthandler 重寫類中的方法 下述 實現了通過sax,獲取xml中所有name標籤的text屬性 public class saxtest 4 建立乙個類,繼承defaulthan class myd...