Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2017 02:00:33

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

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

Tenebras
в некоторых из nodes отсутствует некая информация и программа прерывается. Как это обойти?
Можно проверять через is None.



Офлайн

#2 Фев. 26, 2017 03:26:12

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

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

Он выдаёт AttributeError.
Возможно как-то обрабатывать AttributeError?
is None сейчас попробую

Благодарю!

Офлайн

#3 Фев. 28, 2017 18:39:10

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

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

Новая загвоздка. У меня в блоке встречается не редко по две-три строки <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')
tree = etree.parse('metar.xml') # Парсинг файла
block = tree.xpath('/response/data/METAR')
for bl in block:
	ikao = bl.find('station_id').text
	
	clouds = bl.find('sky_condition')
	if clouds is None:
		continue
		
	cloud = clouds.get('sky_cover')
	print ikao, cloud
	
	

Офлайн

#4 Фев. 28, 2017 19:08:06

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

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

Не оно?

 clouds = bl.findall('sky_condition')
    if clouds is None:
        continue
    for c in clouds:
        cloud = c.get('sky_cover')
        print ikao, cloud

Офлайн

#5 Фев. 28, 2017 19:51:44

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

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

 #...
for bl in block:
    ikao = bl.find('station_id').text
    clouds = bl.findall('sky_condition')
    out = []
    for i in clouds:
        out.append(i.get('sky_cover'))
    print ikao,' '.join(out)        

Отредактировано vic57 (Фев. 28, 2017 19:52:27)

Офлайн

#6 Фев. 28, 2017 20:11:02

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

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

Уважаемый vic57, объясните мне, пожалуйста назначение

  ,' '.join(out)  

Что это и откуда оно берётся.

Спасибо большое!!!

Офлайн

#7 Фев. 28, 2017 20:24:41

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

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

 >>> l =['qwe','asd','dfg']
>>> l
['qwe', 'asd', 'dfg']
>>> ' '.join(l)
'qwe asd dfg'
>>> ':'.join(l)
'qwe:asd:dfg'
>>> 
можешь проще
  #...
for bl in block:
    ikao = bl.find('station_id').text
    clouds = bl.findall('sky_condition')
    out = ''
    for i in clouds:
        out += i.get('sky_cover')+ ' '
    print ikao,out

Отредактировано vic57 (Фев. 28, 2017 20:32:42)

Офлайн

#8 Фев. 28, 2017 20:42:39

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

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



Кажется первый вариант более простой)))

Офлайн

#9 Фев. 28, 2017 23:01:49

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

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

Не хочу ради такого простого вопроса создавать новую тему. Тем более оно имеет отношение к этой.
Я из xml беру время. Как мне его грамотно разбить?
Я делаю так:

 #...
time = '2017-02-28T20:55:00Z'
tim = time.split(r'T')
ti = tim[1].split(r':')
t = ti[0]+':'+ti[1]
print t  

>>> 20:55

Вопрос в громоздкости. Можно ли как-то укротить? Я разбивал в два этапа. Сперва по Т, потом по :
Можно это сделать одной строкой?

И прибавлю ещё один вопрос:

 #
a = 1.00
b = 0.75
c = 0.00
x = [a,b,c]
print min(x)

Как получить на выходе

>>> 0.00

У меня, понятное дело, выводит 0.0

Отредактировано Tenebras (Фев. 28, 2017 23:37:22)

Офлайн

#10 Фев. 28, 2017 23:47:04

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

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

Можно через регулярные выражения, но не факт что быстрее. Надо проверить на скорость.

 import re
t = '2017-02-28T20:55:00Z'
print(re.findall(re.compile(r'(\d{1,2}:\d{1,2})'), t))

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version