Skip to content

Instantly share code, notes, and snippets.

@lozhn
Created November 23, 2014 02:40
Show Gist options
  • Save lozhn/b15410b88a986ce069f5 to your computer and use it in GitHub Desktop.
Save lozhn/b15410b88a986ce069f5 to your computer and use it in GitHub Desktop.
Parses to JSON a timetable on baikal-ppk.ru
# -•- 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