Форум сайта python.su
Выдаёт в итоге квадратные скобки и всё. Что я не так делаю?
Только начал осваивать работу с xml
#!/usr/bin/env python # coding:utf8 from lxml import etree import urllib url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml' urllib.urlretrieve(url, filename='metar.xml') tree = etree.parse('metar.xml') # Парсинг файла nodes = tree.xpath('response/data/METAR/sky_condition') # Открываем раздел for node in nodes: # Перебираем элементы print node.tag,node.keys(),node.values() print 'sky_cover =',node.get('sky_cover') # Выводим параметр sky_cover
Отредактировано Tenebras (Фев. 19, 2017 01:24:21)
Офлайн
Tenebrasnodes = tree.xpath('response/data/METAR/sky_condition') # Открываем раздел
nodes = tree.xpath('/response/data/METAR/sky_condition') # Открываем раздел
Офлайн
Спасибо! Ни как не научусь искать проблемы в мелочах! Что ж такое-то…
Офлайн
Дополнение к предыдущему вопросу. Код несколько дополнился.
#!/usr/bin/env python # coding:utf8 from lxml import etree import urllib url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml' urllib.urlretrieve(url, filename='metar.xml') #page = urllib.urlopen(url) tree = etree.parse('metar.xml') # Парсинг файла ikao = tree.xpath('/response/data/METAR/station_id') clouds = tree.xpath('/response/data/METAR/sky_condition') # Открываем раздел #for node in nodes: # Перебираем элементы for i in ikao: print 'ikao =',[ikao.text] # Выводим текст элемента for cloud in clouds: # Перебираем элементы print 'cloud =',cloud.get('sky_cover') # Выводим параметр cloud
ikao = Traceback (most recent call last): File "xml.py", line 15, in <module> print 'ikao =',[ikao.text] # Выводим текст элемента AttributeError: 'list' object has no attribute 'text'
<response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML-Schema-instance" version="1.2" xsi:noNamespaceSchemaLocation="http://aviationweather.gov/adds/schema/metar1_2.xsd"> <request_index>671358200</request_index> <data_source name="metars"/> <request type="retrieve"/> <errors/> <warnings/> <time_taken_ms>573</time_taken_ms> <data num_results="4696"> <METAR> <raw_text>GOOY 192200Z 01005KT 8000 NSC 20/17 Q1014 NOSIG</raw_text> <station_id>GOOY</station_id> <observation_time>2017-02-19T22:00:00Z</observation_time> <latitude>14.72</latitude> <longitude>-17.5</longitude> <temp_c>20.0</temp_c> <dewpoint_c>17.0</dewpoint_c> <wind_dir_degrees>10</wind_dir_degrees> <wind_speed_kt>5</wind_speed_kt> <visibility_statute_mi>4.97</visibility_statute_mi> <altim_in_hg>29.940945</altim_in_hg> <quality_control_flags> <no_signal>TRUE</no_signal> </quality_control_flags> <sky_condition sky_cover="CLR"/> <flight_category>MVFR</flight_category> <metar_type>METAR</metar_type> <elevation_m>24.0</elevation_m> </METAR>
Офлайн
TenebrasТам несколько элементов, либо вообще нет элементов. Если элементы есть, нужно либо первый элемент взять и к нему применить взятие text, либо ко всем элементам применить взятие text.AttributeError: 'list' object has no attribute 'text'
[i.text for i in ikao]
Офлайн
Сработало! Только цикл бесконечен.
Офлайн
как уже было видно выше - имеем следующее:
#!/usr/bin/env python # coding:utf8 from lxml import etree import urllib url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml' urllib.urlretrieve(url, filename='metar.xml') #page = urllib.urlopen(url) tree = etree.parse('metar.xml') # Парсинг файла ikao = tree.xpath('/response/data/METAR/station_id') clouds = tree.xpath('/response/data/METAR/sky_condition') # Открываем раздел #for node in nodes: # Перебираем элементы for i in ikao: print 'ikao =',[ikao.text] # Выводим текст элемента for cloud in clouds: # Перебираем элементы print 'cloud =',cloud.get('sky_cover') # Выводим параметр cloud
Офлайн
TenebrasТебе надо взять вот так
Подскажите - как это можно реализовать?
nodes = tree.xpath('/response/data/METAR')
>>> import lxml.etree >>> >>> doc = lxml.etree.fromstring('<a><b><c>1</c></b><b><c>2</c></b></a>') >>> >>> nodes = doc.findall('b') >>> for node in nodes: ... subnode = node.find('c') ... print(subnode.text) ... 1 2 >>>
Отредактировано py.user.next (Фев. 25, 2017 03:55:10)
Офлайн
Я читал параметры так, может пригодится:
import subprocess import xml.dom.minidom import time time.sleep(1) subprocess.call('wget -q http://xml.meteoservice.ru/export/gismeteo/point/37.xml', shell=True) dom = xml.dom.minidom.parse("37.xml"); dom.normalize() node1 = dom.getElementsByTagName("HEAT")[0] node2 = dom.getElementsByTagName("TEMPERATURE")[0] a = node1.getAttribute("min") b = node1.getAttribute("max") c = node2.getAttribute("min") d = node2.getAttribute("max") if a >= b: heat = a else: heat = b if c >= d: temper = c else: temper = d print heat print temper
Офлайн
Спасибо! Всё сделал! Но появилась такая проблема:
в некоторых из nodes отсутствует некая информация и программа прерывается. Как это обойти?
Офлайн