2016-10-05 24 views
1

と私は初心者だが、多くの労力と私はこのようになります「weather.xml」と呼ばれる.xmlファイルから天気についていくつかのデータを解析しようとしている:解析天気XMLは、Python

<?xml version="1.0" encoding="UTF-8"?> 
<Weather> 
<locality name="Rome" alt="21"> 
    <situation temperature="18°C" temperatureF="64,4°F" humidity="77%" pression="1016 mb" wind="5 SSW km/h" windKN="2,9 SSW kn"> 
     <description>clear sky</description> 
     <lastUpdate>17:45</lastUpdate> 
     /> 
    </situation> 
    <sun sunrise="6:57" sunset="18:36" /> 
</locality> 

私は、このXMLからいくつかのデータを解析され、これが私のPythonコードは、今どのように見えるかです:

#!/usr/bin/python 

from xml.dom import minidom 
xmldoc = minidom.parse('weather.xml') 

entry_situation = xmldoc.getElementsByTagName('situation') 
entry_locality = xmldoc.getElementsByTagName('locality') 

print entry_locality[0].attributes['name'].value 
print "Temperature: "+entry_situation[0].attributes['temperature'].value 
print "Humidity: "+entry_situation[0].attributes['humidity'].value 
print "Pression: "+entry_situation[0].attributes['pression'].value 

それが正常に動作していますが、私は同じ方法で「説明」または「最終更新日」のノードからのデータを解析しようとした場合私はエラーが発生するので、実際に私はそれらが異なっていることがわかるノードに対して、この方法は間違っていなければなりません。

私はまた、出力をログファイルに書き込もうとしていますが、大部分は空のファイルです。

ありがとうございました。

+0

閉じるが欠けています。 '/>'は7行目で何をしていますか?あなたは既に[lxmlのオブジェクト化API](http://lxml.de/objectify.html)を見ましたか? – yegorich

+0

ファイルがそこで停止しないが、データの取得に気にかけない部分があるため、終了が欠落しています。私はそこで読んだことがありますが、私は自分の使い方のためにコードをどのように適応させるかも理解できません。 Pythonに関する知識は習得しようとしていますが、残念ながら – antonioag

答えて

1

"description"と "lastUpdate"は属性ではなく、 "状況"ノードの子ノードであるからです。

試してみてください。

d = entry_situation[0].getElementsByTagName("description")[0] 
print "Description: %s" % d.firstChild.nodeValue 

あなたは、その親の「地域」から「状況」ノードにアクセスするために同じ方法を使用する必要があります。

ちなみに、lxmlモジュール、特にyegorich氏のようにオブジェクト化APIを見てください。それは使いやすいです。

+0

これはうまくいきました。それは "description"のために機能します。もし "lastUpdate"のための他のコードを追加すると、 "description"に "lastUpdate"だけしか表示されません。 – antonioag

+0

それはしないでください。 'd = entry_situation [0] .getElementsByTagName(" description ")[0]' 'print"説明:%s "%d.firstChild.nodeValue' ' l = entry_situation [0] ] .getElementsByTagName( "lastUpdate")[0] ' ' print "最終更新日:%s"%l.firstChild.nodeValue' –

+0

出力は今ではまったく問題ありません。私が今達成したいのは、 "プリント"のものをファイルにパイプすることです。私はこのコマンドを使用してシェルから直接試しました:./script.py>これは私に、コード "import codec import locale import sys"と "sys.stdout = codecs .getwriter(locale.getpreferredencoding())(sys.stdout) "を参照してください。それは動作しますが、私が達成したいのはファイルに追加することです。常に上書きするのではありません。 .pyから直接ストリームを出力するコードをいくつか入れても、ASCIIエラーが発生します。私はTIMESTAMP +すべての "印刷"のものを持っていたいです – antonioag