def pobierz_przystanki(self): """ Jeœli ju¿ mamy przystanki, zwróæ je. W przeciwnym razie wejdŸ na linka z obiektu, przeskocz ramki i dla ka¿dego z kierunków, przetwórz go. """ if not self.przystanki: tree = html.parse(self.url) tree = wybierz_ramke(tree,'rozklad',self.base_url) tree = wybierz_ramke(tree,'D',self.base_url) kat_linia = 'przetworzone/lista_przystankow/%s' % \ self.nazwa kierunki = tree.xpath('//td [@class="przyst"]') makedir_quiet(kat_linia) plik_ilosc_kier = open(kat_linia+'/il_kier.csv','w') print(len(kierunki),file=plik_ilosc_kier) plik_ilosc_kier.close() for i in range(len(kierunki)): self.przetworz_kierunek(kierunki[i],i) return self.przystanki
def listuj_linie(url): """ Funkcja wchodzi na podanego URL'a (w przypadku strony MPK, musi nast¹piæ przekierowanie, bo mamy index.jsp, a nie .html) i pobiera listê linii. TODO: rozró¿niaæ autobusy dzienne/nocne i tramwaje? Na tej podstronie jest taka mo¿liwoœæ. """ tree = html.parse(url+'/index.html') przekierowanie = tree.xpath('//meta [@http-equiv="refresh"]') if przekierowanie: #Wybierz pierwszy element z tej tablicy i weŸ tekst na #prawo od URL w jego 'content'. nowy_url = przekierowanie[0].attrib['content'].split( 'URL=')[-1] tree = html.parse(nowy_url) linie_tree = wybierz_ramke(tree,'rozklad',url) linie_td = linie_tree.xpath('//div [contains(@id,bx1)]//td \ [@class="nagl" and not(contains( \ .,"Aktualny"))]') ret = [] makedir_quiet('przetworzone') f = open('przetworzone/lista_linii.txt','w') for linia in linie_td: link = linia.xpath('a')[0] #wytnij "Linia: " z linka i uznaj to za nazwê linii nazwa_linii = link.text_content().lstrip("Linia: ") url_linii = url+link.attrib['href'] ret += [Linia(nazwa_linii,url_linii,url)] print(nazwa_linii,file=f) return ret
def przetworz_rozklad(url,base_url,stary_base_url,nazwa_linii,i): """ Pobieramy rozk³ad i przetwarzamy go. Do odczytania ramek potrzebne by³o czary_mary z base_url i stary_base_url. Wynika to ze sposobu, w jaki pliki z rozk³adami s¹ zapisane w pliku .zip na stronie. Poza znakiem zapytaniem w treœci, trzeba by³o jeszcze jakoœ rozwi¹zaæ "../" w adresach. """ zwracany_rozklad = Rozklad() docelowy_url = popraw_file_url(base_url+url) tree = html.parse(docelowy_url) if url.find('ramka.html?l=')!=-1: #wersja z ZIPa #wybieramy l= oraz p= z URL'a i symulujemy dzia³anie #kodu JS w ZIPach - ³adujemy odpowiedni plik. par = re.findall('\?l=(.*?)&p=(.*?)&k',url)[0] nowy_url = "%s/%s/%s.htm" % ( stary_base_url,par[0],par[1]) try: #USUN¥Æ PO TESTACH tree = html.parse(nowy_url) except: print("t³umiê b³¹d pobierania: %s" % nowy_url) return #tree = html.fromstring( # nowy_html.decode('windows-1250')) else: #wersja ze strony tree = wybierz_ramke(tree,'T',base_url) #Wybieramy dwie g³ówne tabele. glowne_tabele = tree.xpath('//td [@valign="TOP"]') assert(len(glowne_tabele)==2) #Nastêpnie, wyci¹gamy tabelê z czasami oraz rozk³adem. tabela_z_czasami = glowne_tabele[0] tabela_z_rozkladem = glowne_tabele[1].xpath('./table')[0] assert(len(tabela_z_rozkladem.xpath('./tr'))==4) #ID przystanku jest w takim TD, który nie ma ustawionej klasy #a jednoczeœnie ma colspan=2 i align=center. id_przystanku_td = tree.xpath('//td[not(@class="naglczas") \ and @align="CENTER" and @colspan="2"]') assert(len(id_przystanku_td)==1) #TODO: Mo¿e to jest lepsze miejsce do wyci¹gania nazw #przystanków? id_przystanku_tekst = id_przystanku_td[0].text_content() #Wzorzec - coœtam, coœtam w nawiasie, koniec. Interesuje nas #to drugie coœtam. id_przystanku = re.findall('(.*)\((.*?)\)$', id_przystanku_tekst)[0] #Ustawiamy to zwracanemu obiektowi. zwracany_rozklad.id_przystanku = id_przystanku[1] #utwórz na wszelki wypadek katalog na listy przystanków, #a nastêpnie otwórz plik_lista, gdzie dopiszemy i-ty kierunek nazwa_katalogu = 'przetworzone/lista_przystankow/'+nazwa_linii makedir_quiet(nazwa_katalogu) plik_lista = open("%s/%d.csv" % (nazwa_katalogu,i),'a') print("%s" % id_przystanku[1], file=plik_lista) plik_lista.close() #Tworzymy katalog dla tego konkretnego rozk³adu. nazwa_katalogu = 'przetworzone/rozklady/%s/%s' % (nazwa_linii, id_przystanku[1]) makedir_quiet(nazwa_katalogu) #To te¿ ustawiamy zwracanemu obiektowi. zwracany_rozklad.nazwa_katalogu = nazwa_katalogu #Wybieramy tr'ki z tabeli z rozk³adem. Rozk³ad to drugi tr, #nag³ówek ('W niedziele/dni robocze' itp) jest w pierwszym. wiersze_tabeli_z_rozkladem = tabela_z_rozkladem.xpath('./tr') rozklad = wiersze_tabeli_z_rozkladem[2] naglowki = wiersze_tabeli_z_rozkladem[0] #Otwieramy plik na nag³ówki. plik_naglowki = open('%s/naglowki.csv' % nazwa_katalogu ,'w') #Wyci¹gamy z rozk³adu kolumny i iterujemy od 0 do po³owy ich #liczby. kolumny_rozkladu = rozklad.xpath('./td') for i in range(int(len(kolumny_rozkladu)/2)): #Zczytujemy nazwê nag³ówka i zapisujemy j¹. nazwa_naglowka = naglowki[i].text_content() print("%s,%s" % (i,nazwa_naglowka),file=plik_naglowki) #Przetwarzamy parê kolumn rozk³adu - godziny i minuty. zwracany_rozklad.przetworz_kolumne_rozkladu( kolumny_rozkladu[i*2], kolumny_rozkladu[i*2+1],i) return zwracany_rozklad