【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を解析するのは簡単です.一般に、start_elementend_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'''                              
    
    1. Python
    2. Ruby
    '''
    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を しましょう( ̄▽ ̄)~*