Portál AbcLinuxu, 6. listopadu 2025 04:25
Pokud někde není variabilní symbol (resp. kterýkoli ze 3 údajů), řádek se přeskočí. Sekvenci (1,10,13) můžete nahradit (7,10,13) nebo (8,10,13), podle toho, který datum chcete do přeheldu vkládat.
#!/usr/bin/env python
import urllib2
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def parse(self, html):
self.tdcounter = 0
self.within_tbody = False
self.thead_found = False
self.platby = []
self.platba_parsed = []
self.feed(html)
self.close()
def handle_starttag(self, tag, attrs):
if tag == 'td': self.tdcounter += 1
if tag == 'tbody' and self.thead_found:
self.within_tbody = True
def handle_data(self, data):
if 'Variabil' in data: self.thead_found = True
if self.within_tbody:
# if self.tdcounter in (4,13,17):
if self.tdcounter in (1,10,13):
self.platba_parsed.append(data.strip())
def handle_startendtag(self, tag, attrs):
if self.within_tbody and tag == 'br':
self.tdcounter += 1
def handle_endtag(self, tag):
if tag == 'tr':
self.tdcounter = 0
if self.platba_parsed and len(self.platba_parsed) == 3 :
self.platby.append(self.platba_parsed)
self.platba_parsed = []
if tag == 'tbody': self.within_tbody = False
url = 'http://www.rb.cz/firemni-finance/transparentni-ucty/?root=firemni-finance&item1=transparentni-ucty&tr_acc=vypis&account_number=2588438001'
htmlcache = 'ebanka_cache'
try:
contents = file(htmlcache).read()
except:
handler = urllib2.urlopen(url)
contents = handler.read()
handler.close()
file(htmlcache, 'w').write(contents)
parser = MyHTMLParser()
parser.parse(contents)
for datum, varsymb, castka in parser.platby:
print '%s;%s;%s;'%(datum, varsymb, castka)
V konqueroru/opere/firefoxu jsem vzdy ziskal kratky format data. Ten je presneji "22.04.2008 04:12". Dlouhy format je "2008-06-11 09:55:11.0 2008-06-11 09:55:11.0".Jestli si to dobře pamatuju, měl jsem ve FF v prvním sloupci krátký formát data i s časem, a v tom sloupci, kde jsou dvě data, byl krátký formát bez času. Ale ve skriptu mi to vracelo v různých formátech. Docela by mne zajímalo, jak může vůbec takovýhle problém se střídavým formátováním vzniknout, protože se evidentně mění formát i u jednoho stejného řádku – takže to není ovlivněno konkrétní hodnotou data. Chápal bych, kdyby to bylo různou konfigurací počítačů v clusteru, ale jednu stránku snad vygeneruje jeden počítač, pochybuju, že by se na tom střídaly po řádcích…
Jeste to ma nejaky problemy, ale castecne je prikladam tomu ze RB kazdou chvili vraci neco jineho. Jednou mam datum ve formatu "2008-05-07 05:58:54.0" a chvili nato v "27.06.2008". Nicmene s tim si jeste chvili budu hrat sam...A já už jsem přemýšlel, jestli jsem se nezbláznil, když se mi zdálo, že to vrací datum pokaždé v jiném formátu. Jsem rád, že v tom nejsem sám
Zkusil bych poslat e-mail do RB, pochybuju o tom, že je to střídání formátu dat záměr…
tadyhle,
http://www.abclinuxu.cz/forum/show/163882
a už tehdy jsem měl pocit, že se každou chvíli mění formát výpisu. Dík, že jste to potvrdili, už jsem taky myslel, že mi hrabe. Používají dva formáty pro datum i měnu. Někdy je všechno v jednom formátu, někdy v tom druhém a nejčastěji je to smíchanina. Jak to vzniká, to netuším. Zkusil jsem jim posílat jiného user-agenta, ale nepomohlo. Tak tady aspoň přikládám trochu upravenou verzi parseru (nastavitelný user agent a lepší odchytávání chybějících hodnot). Dík Filipovi.
#!/usr/bin/env python
import urllib2
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def parse(self, html):
self.tdcounter = 0
self.within_tbody = False
self.platby = []
self.platba_parsed = []
self.recent_data = ''
self.feed(html)
self.close()
def increase_tdcounter(self):
if not self.within_tbody: return
if self.tdcounter in (0, 8, 11):
self.platba_parsed.append(self.recent_data)
self.tdcounter += 1
self.recent_data = None
def handle_starttag(self, tag, attrs):
if tag == 'tbody': self.within_tbody = True
def handle_data(self, data):
data_stripped = data.strip()
if data_stripped:
self.recent_data = data_stripped
def handle_startendtag(self, tag, attrs):
if tag == 'br': self.increase_tdcounter()
def handle_endtag(self, tag):
if not self.within_tbody: return
if tag == 'td':
self.increase_tdcounter()
if tag == 'tr':
self.tdcounter = 0
self.platby.append(self.platba_parsed)
self.platba_parsed = []
if tag == 'tbody': self.within_tbody = False
url = 'http://www.rb.cz/firemni-finance/transparentni-ucty/?root=firemni-finance&item1=transparentni-ucty&tr_acc=vypis&account_number=2588438001'
htmlcache = 'ebanka_cache.html'
try:
contents = file(htmlcache).read()
except:
browser_id = 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008061712 Fedora/3.0-1.fc9 Firefox/3.0'
request = urllib2.Request(url)
opener = urllib2.build_opener(urllib2.HTTPHandler())
opener.addheaders = [('User-Agent', browser_id)]
contents = opener.open(request).read()
file(htmlcache, 'w').write(contents)
parser = MyHTMLParser()
parser.parse(contents)
for datum, varsymb, castka in parser.platby:
print 'Datum: %s Var.s.: %10s Castka: %s'%(
datum, varsymb, castka)
2008-07-10 08:29:20.0;2008-07-10 08:29:20.0;3800293;-19665.00; 2008-07-10 08:21:42.0;2008-07-10 08:21:42.0;280000066;-1997.00; 2008-07-10 08:11:49.0;2008-07-10 08:11:49.0;185;1400.00; 2008-07-10 05:47:50.0;2008-07-10 05:47:50.0;167;400.00; 2008-07-10 05:47:37.0;2008-07-10 05:47:37.0;9;400.00; 2008-07-10 05:46:18.0;2008-07-10 05:46:18.0;97;400,00; 10.07.2008;04:21;139;400,00; 10.07.2008;04:20;63;400,00; 10.07.2008;04:16;94;400,00; 09.07.2008;09:51;17885708;-3 174,00; 09.07.2008;01:38;108;400,00; 09.07.2008;12:17;169;400,00; 09.07.2008;11:45;49;400,00; 09.07.2008;10:27;191;2 200,00; 09.07.2008;10:27;175;5 200,00;
Jinak jsem taky nasel ulozenej starej vypis z eBanky a tam jsou vsechny datumy v tom dlouhem formatu, takze to skutecne posila ruznym klientum ruzne.Napadá mne jedině že by to byla primitivní snaha zabránit automatickému zpracování, zvlášť jestli to závisí na user-agentovi. Ale taková snaha zvlášť v této podobě by mi přišla neuvěřitelně hloupá… Pokud by to záviselo na jiných hlavičkách (třeba preferovaný jazyk), mohla by to být nějaká chybná konfigurace, kdy se na některé řádky uplatní formátování odvozené od preferovaného jazyka prohlížeče, a na jiné nějaké výchozí nastavení systému. Ale moc si nedovedu představit tu realizaci, protože to by musel znamenat, že každý řádek tabulky generuje jinak nastavený software, tedy že pravděpodobně každý řádek tabulky může vracet jiný počítač z clusteru. A to si raději ani představovat nechci. Jsem zvědav, co vám řekne někdo z technického oddělení – pokud rovnou nezablokují vaši IP adresu
Mozna by bylo reseni to proste kontrolovat rucne a pripadne rucne preskladat.Problém je, že jeden z těch formátů je úplně bez času, takže by tam pak byl asi čas 0:00:00.
neni bez casu, podivej se znovu. Akorat ten cas je bud spolu s datem v obou sloupeccich dublovane nebo je jen v tom druhem sloupecku.Ahá, pro oči nevidím. Tak proto tam máte 4 sloupečky a ne 3. Tak to jo.
Diky za ten tip s "if self.platba_parsed and len(self.platba_parsed) == 4 :" ted uz to nehavaruje na radcich bez hodnot (i takovy tam jsou, treba "Poplatek za generování výpisu").Ta podmínka se dá zjednodušit na if len(self.platba_parsed) == 4. A krom toho je možné se jí zbavit úplně a žádné řádky nezahazovat - viz výše.
Ta podmínka se dá zjednodušit na if len(self.platba_parsed) == 4No jo, když do
ifu dopisuju druhou podmínku, mohl bych se taky podívat, co dělá ta první…
A krom toho je možné se jí zbavit úplně a žádné řádky nezahazovat - viz výše.Nějak to výše nemůžu najít. Jak to řešíte, když u nějaké platby není např. variabilní symbol?
já jsem sledoval i to staré vlákno a nakonec jsem na ebanku používal wget a potom parser v php. Vše fungovalo dobře, ale teď po změně nemohu wgetem stáhnout stránku s výpisem na disk. Vždy vyleze jen nějaká ořezaná verze bez tabulky pohybů (viz příloha).
Nevíte proč mi stránka nejde stáhnout?
Děkuji, zemji.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.