Created
November 23, 2014 02:40
-
-
Save lozhn/b15410b88a986ce069f5 to your computer and use it in GitHub Desktop.
Parses to JSON a timetable on baikal-ppk.ru
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -•- coding: utf-8 -•- | |
import lxml.html | |
import datetime, time | |
import json | |
import requests | |
import sys | |
base_url = 'http://baikal-ppk.ru/schedule/' | |
post_url = 'http://google.com' | |
def error_log(b): | |
time_iso = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') | |
sys.stderr.write(u" ".join([time_iso,b,'\n']) ) | |
schedule = { | |
'data' : [], | |
'ts' : int(datetime.datetime.now().strftime('%s000')), | |
'data_url' : 'http://baikal-ppk.ru/schedule/', | |
'status' : 'OK' | |
} | |
# lxml парсит страницу и создает список элементов с классов padd3 - в них инфо о поездах | |
# в дальнейшем лучше переделать на привязку к самой таблице и уже от неё брать child/children | |
# и сделать не список элементов, а итератор по элементам | |
page = lxml.html.parse(base_url) | |
list_of_padd3 = page.getroot().find_class('padd3') | |
# лист элементов, состоит из tuples | |
# № | t0 | t1 | frm | to | days | drct | |
elements = [] | |
for a in list_of_padd3: | |
x = a.getchildren() | |
try: | |
numb = x[1].text.strip() # номер поезда | |
t0 = x[2].text.strip() if x[2].text else '-' # прибытие | |
t1 = x[3].text.strip() if x[3].text else '-' # отправление | |
tmp = x[4].text.split(u'→') # разбиение строки "Маршрут следования" | |
frm = tmp[0].strip() # начальная станция | |
to = tmp[1].strip() # конечная | |
days = x[5].text.strip() # дни | |
drct = x[6].text.strip() # направление | |
except: | |
print "Table row parse failed" | |
w = u"|".join([x[i].text for i in xrange(1,7)]) | |
error_log(w) | |
schedule['status'] = "Failed" | |
elements.append( (numb, t0, t1, frm, to, days, drct) ) | |
# отладка | |
# for e in elements: | |
# print u"|".join(e) | |
# заносим полученную инфу в наш объект, который потом конвертируем в JSON | |
schedule['data'] = elements | |
data = json.dumps( schedule ) | |
# делаем POST Content-type: application/json на заданный URL | |
r = requests.post( post_url, data=data, headers={'Content-type': 'application/json'} ) | |
if (r.status_code != '200'): | |
error_log('response code NOT 200') | |
# отладка | |
# print data | |
# print len(elements) | |
# print r.status_code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment