##Das Format Format Folio Flat File (FFF) ist ein XML-ähnliches Textformat. ##Nach Durchsicht einiger Beispieldateien gehen wir davon aus, ##daß pro Artikel folgende Tags definiert sind und der entsprechende ##Inhalt dem öffnenden Tag folgt: ##<...:Titel> oder ## ## ## ## ## ## ## oder Absätze ## ##Außerdem gehen wir davon aus, daß folgende optionale Tags pro Artikel ##maximal einmal definiert sind und der entsprechende Inhalt dem öffnenden Tag ##folgt: ## ## Artikel ist für jeden zugänglich ## bzw. Schlagworte ## bzw. Untertitel # -*- coding: cp1252 -*- # by Alex Duesel, www.mandarine.tv import sgmllib, string, re class MyParser(sgmllib.SGMLParser): def __init__(self): sgmllib.SGMLParser.__init__(self) self.result = "" def handle_data(self, data): if data: self.result = data def start_titel(self, attributes): print "processing Titel..." def end_titel(self): print self.result def start_jahrgang(self, attributes): print "processing Jahr..." def end_jahrgang(self): print self.result def start_seite(self, attributes): print "processing Seite..." def end_seite(self): print self.result def start_autor(self, attributes): print "processing Autor..." def end_autor(self): print self.result def start_rubrik(self, attributes): print "processing Rubrik..." def end_rubrik(self): print self.result def start_ausgabe(self, attributes): print "processing Ausgabe..." def end_ausgabe(self): print self.result def start_bemerkungen(self, attributes): print "processing Bemerkungen..." def end_bemerkungen(self): print self.result def do_frei(self): print "processing freigabe JA" def do_absatz(self, attrs): print "processing Absatz:" print ' '.join([v for k,v in attrs]) def do_schlagworte(self, attrs): print "processing Schlagworte:" print ' '.join([v for k,v in attrs]) def do_untertitel(self, attrs): print "processing Untertitel:" print ' '.join([v for k,v in attrs]) class SpecialCaseParser: # Extrawuerste, wie dieses <...:Titel> Tag def __init__(self): self.scan_re = re.compile(r"(?:(?P<.*?\:Titel>))") def _titel_handle(self, case): print "processing Spezial Titel tag...." print case.split(':')[0][1:] def handle(self, match): for type, hit in match.groupdict().items(): if hit: return apply(getattr(self, '_' + type + '_handle'), (hit,)) else: raise "Can't handle match " + `match` def process(self, txt): re.sub(self.scan_re, self.handle, txt) TAG_MAP = { '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'>' } def prepare_text(txt): # falls das zu langsam wird, koennte alles mit regex # statt SGMLParser realisiert werden, wie oben for k in TAG_MAP.keys(): txt = txt.replace(k,TAG_MAP[k]) return txt def process(s): special = SpecialCaseParser() special.process(s) parser = MyParser() parser.feed(s) parser.close() test_txt = ''' 1991 2 54 J.R.R Tolkien Abenteuer schöne Geschichte Der Herr der Ringe 1993 4 254 J.R.R Tolkien Abenteuer Saga sehr spannende Geschichte ''' process(prepare_text(test_txt))