2016-10-05 90 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 

它的工作正常,但如果我嘗試解析「說明」或者用同樣的方法「LASTUPDATE」節點數據,我得到一個錯誤,所以對於那些實際上我可以看到它們是不同的節點,這種方式一定是錯誤的。

我也試圖將輸出寫入日誌文件沒有成功,我得到的最多是一個空文件。

謝謝你的閱讀時間。

+0

結束缺失。 7號線正在做什麼?順便說一句,你已經看過[lxml的objectify 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

它以這種方式工作,我對你表示非常感謝。它適用於「描述」,如果我爲「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

輸出現在絕對沒問題。我現在想要實現的是將「打印」內容傳送到文件。我試着直接從shell使用這個命令:./script.py>它給了我一些ASCII錯誤,我通過寫入代碼「import codecs import locale import sys」和「sys.stdout = codecs .getwriter(locale.getpreferredencoding())(sys.stdout)「。它的工作原理,但我想實現的是追加到一個文件,並不總是覆蓋它。如果我把一些代碼直接從.py輸出流,它會給出ASCII碼錯誤。我想有TIMESTAMP +所有「打印」的東西 – antonioag