Exemplo n.º 1
0
	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
Exemplo n.º 2
0
	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
Exemplo n.º 3
0
	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