Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 19, 2017 01:23:50

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Выдаёт в итоге квадратные скобки и всё. Что я не так делаю?
Только начал осваивать работу с 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)

Офлайн

#2 Фев. 19, 2017 12:36:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Не работает парсер

Tenebras
 nodes = tree.xpath('response/data/METAR/sky_condition') # Открываем раздел
 nodes = tree.xpath('/response/data/METAR/sky_condition') # Открываем раздел



Офлайн

#3 Фев. 19, 2017 22:42:25

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Спасибо! Ни как не научусь искать проблемы в мелочах! Что ж такое-то…

Офлайн

#4 Фев. 20, 2017 16:21:45

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Дополнение к предыдущему вопросу. Код несколько дополнился.

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

Офлайн

#5 Фев. 20, 2017 17:01:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Не работает парсер

Tenebras
 AttributeError: 'list' object has no attribute 'text'
Там несколько элементов, либо вообще нет элементов. Если элементы есть, нужно либо первый элемент взять и к нему применить взятие text, либо ко всем элементам применить взятие text.

Пробуй включение
 [i.text for i in ikao]



Офлайн

#6 Фев. 20, 2017 17:48:13

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Сработало! Только цикл бесконечен.

Офлайн

#7 Фев. 24, 2017 23:46:58

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

как уже было видно выше - имеем следующее:

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

Подскажите - как это можно реализовать?
Не осилил…Те два цикла - моя ошибка…

Офлайн

#8 Фев. 25, 2017 03:54:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Не работает парсер

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
>>>



Отредактировано py.user.next (Фев. 25, 2017 03:55:10)

Офлайн

#9 Фев. 25, 2017 12:43:46

appolo440
Зарегистрирован: 2017-02-24
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Я читал параметры так, может пригодится:

 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

Офлайн

#10 Фев. 25, 2017 17:25:20

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Спасибо! Всё сделал! Но появилась такая проблема:
в некоторых из nodes отсутствует некая информация и программа прерывается. Как это обойти?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version