【Python入門】31.常用内蔵モジュールのXML&Yahoo天気予報情報のキャプチャ
要旨:XMLの紹介;SAXでXMLテキストを解析する方法XMLテキスト生成;YahooのXML形式のテキストを解析して天気予報情報を取得します.
前に書きます:pythonをもっとよく学ぶために、ブロガーは自分の学習の道のりを記録します.この学習ノートは廖雪峰のPython教程に基づいており、権利侵害があれば削除をお知らせください.ブロガーと一緒にPythonヽ( ̄▽ ̄)ノを勉強することを歓迎します.
目次常用内蔵モジュール XML SAX解析XML XML生成 【練習】Yahoo天気予報情報 を取得
共通の組み込みモジュール
XML
XMLは拡張可能なタグ言語(eXtensible Markup Language)を指す.これはデータの伝送と記憶によく使われるツールであり、情報記憶と記述の分野で非常に流行している.
XMLを操作する一般的な方法はDOMとSAXです.DOMはメモリを占有し、解析が遅いが、任意のノードを遍歴することができる.SAXは、メモリの消費量が小さく、解析が速いが、自分でイベントを処理する必要がある.
通常、DOMがメモリをあまりにも占めているため、SAXを優先します.--りょう雪峰
XMLをSAXで解析する方法を説明します.
SAX解析XML
SAX(simple API for XML)は、イベント駆動モデル、すなわちXMLを解析する過程で各イベントをトリガーし、同時にユーザ定義のコールバック関数を呼び出してXMLファイルを処理する.SAXには解析器とイベントプロセッサの2つの大部分があります.
解析器:XMLファイルを読み込み、イベントプロセッサにイベントを送信します.≪イベント・プロセッサ|Event Processor|emdw≫:各イベントに応答し、伝達されたデータを処理します.
PythonではSAXを使ってXMLを解析するのは簡単です.一般に、
たとえば、解析器がXMLのノードを読み込むとします.
3つのイベントが発生します.
前に書きます:pythonをもっとよく学ぶために、ブロガーは自分の学習の道のりを記録します.この学習ノートは廖雪峰のPython教程に基づいており、権利侵害があれば削除をお知らせください.ブロガーと一緒にPythonヽ( ̄▽ ̄)ノを勉強することを歓迎します.
目次
共通の組み込みモジュール
XML
XMLは拡張可能なタグ言語(eXtensible Markup Language)を指す.これはデータの伝送と記憶によく使われるツールであり、情報記憶と記述の分野で非常に流行している.
XMLを操作する一般的な方法はDOMとSAXです.DOMはメモリを占有し、解析が遅いが、任意のノードを遍歴することができる.SAXは、メモリの消費量が小さく、解析が速いが、自分でイベントを処理する必要がある.
通常、DOMがメモリをあまりにも占めているため、SAXを優先します.--りょう雪峰
XMLをSAXで解析する方法を説明します.
SAX解析XML
SAX(simple API for XML)は、イベント駆動モデル、すなわちXMLを解析する過程で各イベントをトリガーし、同時にユーザ定義のコールバック関数を呼び出してXMLファイルを処理する.SAXには解析器とイベントプロセッサの2つの大部分があります.
解析器:XMLファイルを読み込み、イベントプロセッサにイベントを送信します.≪イベント・プロセッサ|Event Processor|emdw≫:各イベントに応答し、伝達されたデータを処理します.
PythonではSAXを使ってXMLを解析するのは簡単です.一般に、
start_element
end_element
およびchar_data
の3つのイベントを定義すればよい.たとえば、解析器がXMLのノードを読み込むとします.
<a href="/">pythona>
3つのイベントが発生します.
start_element
は、読み出し開始ラベル
のときに呼び出される.char_data
は、データコンテンツpython
を読み出すときに呼び出される.end_element
は、読み取り終了ラベル :
, , ParserCreate()
で を し、parser.Parse
でテキストを すればよい. なコードを てください( のコードは を いて サイトから します):
from xml.parsers.expat import ParserCreate #
class DefaultSaxHandler(object): #
def start_element(self, name, attrs): #
print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))
def end_element(self, name): #
print('sax:end_element: %s' % name)
def char_data(self, text): #
print('sax:char_data: %s' % text)
# xml
xml = r'''
'''
handler = DefaultSaxHandler() #
parser = ParserCreate() #
parser.StartElementHandler = handler.start_element #
parser.EndElementHandler = handler.end_element #
parser.CharacterDataHandler = handler.char_data #
parser.Parse(xml) # xml
:sax:start_element: ol, attrs: {}
sax:char_data:
sax:char_data:
sax:start_element: li, attrs: {}
sax:start_element: a, attrs: {'href': '/python'}
sax:char_data: Python
sax:end_element: a
sax:end_element: li
sax:char_data:
sax:char_data:
sax:start_element: li, attrs: {}
sax:start_element: a, attrs: {'href': '/ruby'}
sax:char_data: Ruby
sax:end_element: a
sax:end_element: li
sax:char_data:
sax:end_element: ol
これでXMLテキストの に しました( ̄▽ ̄)/
XML
XMLのほかに、XMLを するにはどうすればいいですか?
も な でappendをつなぎ わせます.L = []
L.append(r'')
L.append(r'' )
L.append(('some & data').encode)
L.append(r'')
return ''.join(L)
なXMLを するとしたら?XMLを わずにJSONに することをお めします.--りょう
【 】Yahoo の
( は サイトより)
SAX プログラムでYahooのXML の を し、 を してください.
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20 where%20 woeid%20%3 D%202151330&format=xmlパラメータwoeidは コードで、ある コードを するにはweather.yahoo.comは を し、ブラウザのアドレスバーのURLには コードが まれています.# -*- coding:utf-8 -*-
from xml.parsers.expat import ParserCreate # xml
from urllib import request # URL
class WeatherSaxHandler(object): #
weather = {'city':1, 'forecast':[]} # city forecast
def start_element(self, name, attrs): #
if name == 'yweather:location': # location
self.weather['city'] = attrs['city']
elif name =='yweather:forecast': # forecast
self.weather['forecast'].append({
'date':attrs['date'],
'high':attrs['high'],
'low':attrs['low']
})
def parseXml(xml_str): # xml
handler = WeatherSaxHandler()
parser = ParserCreate()
parser.StartElementHandler = handler.start_element
parser.Parse(xml_str) # xml
print('City: ' + handler.weather['city']) # city
print('Weather: ')
for x in handler.weather['forecast']: #
print(x)
return handler.weather
# :
URL = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=xml'
with request.urlopen(URL, timeout=4) as f:
data = f.read()
result = parseXml(data.decode('utf-8'))
assert result['city'] == 'Beijing'
:City: Beijing
Weather:
{'date': '30 Aug 2018', 'high': '80', 'low': '69'}
{'date': '31 Aug 2018', 'high': '84', 'low': '66'}
{'date': '01 Sep 2018', 'high': '83', 'low': '69'}
{'date': '02 Sep 2018', 'high': '80', 'low': '69'}
{'date': '03 Sep 2018', 'high': '89', 'low': '67'}
{'date': '04 Sep 2018', 'high': '88', 'low': '71'}
{'date': '05 Sep 2018', 'high': '87', 'low': '69'}
{'date': '06 Sep 2018', 'high': '83', 'low': '67'}
{'date': '07 Sep 2018', 'high': '81', 'low': '64'}
{'date': '08 Sep 2018', 'high': '80', 'low': '64'}
Yahoo の コード、モディファイヤURLの を っていれば、これでYahoo を できます( ̄▽ ̄)/
がこの のすべての で、あなたの に します.
のセクションでは、 み みモジュールのHTML parserをよく します.
か や えがあれば、コメントやツッコミを します.
ブロガーと にPythonを しましょう( ̄▽ ̄)~*