Найти - Пользователи
Полная версия: Не работает парсер
Начало » Центр помощи » Не работает парсер
1 2 3 4
Tenebras
Выдаёт в итоге квадратные скобки и всё. Что я не так делаю?
Только начал осваивать работу с 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
py.user.next
Tenebras
 nodes = tree.xpath('response/data/METAR/sky_condition') # Открываем раздел
 nodes = tree.xpath('/response/data/METAR/sky_condition') # Открываем раздел
Tenebras
Спасибо! Ни как не научусь искать проблемы в мелочах! Что ж такое-то…
Tenebras
Дополнение к предыдущему вопросу. Код несколько дополнился.
 #!/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'

Я смотрел на пример и на основе его всё делал. Там работало.

Вот кусок xml с которым я работаю
 <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>
py.user.next
Tenebras
 AttributeError: 'list' object has no attribute 'text'
Там несколько элементов, либо вообще нет элементов. Если элементы есть, нужно либо первый элемент взять и к нему применить взятие text, либо ко всем элементам применить взятие text.

Пробуй включение
 [i.text for i in ikao]
Tenebras
Сработало! Только цикл бесконечен.
Tenebras
как уже было видно выше - имеем следующее:

 #!/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

Моя задача, что бы цикл прошёлся по всему XML-файлу, и из каждого БЛОКА считал эти IKAO и CLOUD.
Блоком я назвал то, что находится между тегами <METAR> и </METAR>. Каждый такой блог содержит только одно значение station_id и один - несколько значений sky_cover.

Подскажите - как это можно реализовать?
Не осилил…Те два цикла - моя ошибка…
py.user.next
Tenebras
Подскажите - как это можно реализовать?
Тебе надо взять вот так
 nodes = tree.xpath('/response/data/METAR')
А потом просто их в цикле перебрать по узлу и у каждого взять через find() нужные теги.

Вот пример:
  
>>> 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
>>>
appolo440
Я читал параметры так, может пригодится:

 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
Tenebras
Спасибо! Всё сделал! Но появилась такая проблема:
в некоторых из nodes отсутствует некая информация и программа прерывается. Как это обойти?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB