2016-10-05 2 views
1

Я новичок, но с большим усилием я пытаюсь разобрать некоторые данные о погоде из файла .xml под названием «weather.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's objectify API] (http://lxml.de/objectify.html)? – yegorich

+0

Закрытие отсутствует, потому что файл не останавливается на достигнутом, но есть часть, из которой я не хочу извлекать данные. Я читал там, но я не понимаю, как я могу адаптировать код для моего использования. Попытка узнать, но не знать о Python вообще, к сожалению – antonioag

ответ

1

Это потому, что «description» и «lastUpdate» не являются атрибутами, а дочерними узлами узла «ситуация».

Try:

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

Вы должны использовать тот же метод, чтобы получить доступ к «ситуации» узел из его родителя «локальности».

Кстати, вы должны взглянуть на модуль lxml, особенно объективировать API, как сказал его. Это проще в использовании.

+0

Это сработало так, и я говорю огромное спасибо вам. Он работает для «описания», если я добавляю другой код для «lastUpdate», он всегда показывает мне только «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

Выход теперь абсолютно прекрасен. То, что я хочу достичь, - это передать материал «print» в файл. Я пробовал прямо из оболочки с помощью этой команды: ./script.py> Это дало мне некоторые ошибки ASCII, которые я разрешил, написав код «импортировать кодеки import locale import sys» и «sys.stdout = codecs .getwriter (locale.getpreferredencoding()) (sys.stdout) ". Он работает, но я хочу добавить к файлу, а не всегда перезаписывать его. Если я поставлю некоторый код для вывода потока непосредственно из .py, он даст ошибки ASCII. Я хотел бы иметь TIMESTAMP + все «печатные» вещи – antonioag

Смежные вопросы