#!/usr/bin/env python # -*- coding=utf8 -*- import sys, re, time import urllib2, httplib import locale import HTMLParser searchurl = "http://www.siegen.de/abfallkalender/seite.cfm?seite=151&strasse&schlagwort=%(suchstring)s&modul=druckansicht&print" nameurl = "http://www.siegen.de/abfallkalender/seite.cfm?kalenderKomplett&strasseid=%(strasseid)d&seite=151&print" baseurl = "http://www.siegen.de/abfallkalender/printout.cfm?strasseid=%(strasseid)d&month=%(month)d&year=%(year)d" tonnenmapping = { "Restmülltonne (2 wöchig)": "R2", "Restmülltonne (4 wöchig)": "R4", "Gelber Sack": "G", "Biotonne (braune)": "B", "Altpapiertonne (4 wöchig)": "P", } tonnenfwdmapping = { "R2": "Restmüll", "R4": "Restmüll++", "G": "Gelber Sack", "B": "Biotonne", "P": "Papier", } class MuellHandler (HTMLParser.HTMLParser): def __init__ (self): HTMLParser.HTMLParser.__init__ (self) self.tagnesting = [] self.day = 0 self.month = 0 self.year = 0 self.tonnen = [] # these functions do some dispatching for the different tags # via introspection. def handle_starttag (self, name, attrs): self.tagnesting.append (name) handler = MuellHandler.__dict__.get ("handle_start_" + name, None) if handler: handler (self, attrs) def handle_data (self, chars): if not self.tagnesting: return handler = MuellHandler.__dict__.get ("handle_chars_" + self.tagnesting[-1]) if handler: handler (self, chars) def handle_endtag (self, name): self.tagnesting.pop () handler = MuellHandler.__dict__.get ("handle_end_" + name, None) if handler: handler (self) # actual handlers. Must have the name "handle_start_" def handle_chars_font (self, chars): try: self.day = int (chars) except: pass def handle_chars_span (self, chars): if self.day: self.tonnen.append (tonnenmapping[chars]) def handle_end_td (self): if self.tonnen: l = [] if "R4" in self.tonnen: l.append (tonnenfwdmapping ["R4"]) elif "R2" in self.tonnen: l.append (tonnenfwdmapping ["R2"]) if "G" in self.tonnen: l.append (tonnenfwdmapping ["G"]) if "P" in self.tonnen: l.append (tonnenfwdmapping ["P"]) if "B" in self.tonnen: l.append (tonnenfwdmapping ["B"]) print time.strftime (" %a, %e.:", time.localtime (time.mktime ((self.year, self.month, self.day, 0, 0, 0, 0, 0, 0)))), ", ".join (l) self.tonnen = [] if __name__ == '__main__': locale.setlocale (locale.LC_ALL, "de_DE.UTF-8") suche = "" if len (sys.argv) > 1: suche = sys.argv[-1].decode("utf-8").encode ("iso8859-1") while not suche: try: print >>sys.stderr, "Bitte Teil des Straßennamen eingeben:" print >>sys.stderr, "> ", suche = raw_input ("") except EOFError: print >>sys.stderr sys.exit (0) data = { 'suchstring': suche } datafile = urllib2.urlopen (searchurl % data) data = datafile.read().decode ('iso8859-1').encode ('utf-8') d = re.findall ('
  • ([^<]+)
  • ', data) if not len (d): id = re.findall ('printout.cfm\?year=[0-9]+&month=[0-9]+&strasseid=([0-9]+)"', data) if len (id) != 1: print >>sys.stderr, "Straße nicht gefunden" sys.exit (1) data = { 'strasseid': int(id[0]) } datafile = urllib2.urlopen (nameurl % data) data = datafile.read().decode ('iso8859-1').encode ('utf-8') name = re.findall ('Entsorgungstermine: ([^<]+)', data)[0] d = [(id[0], name)] while len (d) > 1: print >>sys.stderr, "Bitte Straße auswählen:" for i in range (len (d)): name = " ".join ([j.lower().capitalize() for j in d[i][1].split()]) print >>sys.stderr, "% 2d. %s" % (i+1, name) try: print >>sys.stderr, "> ", i = raw_input ("") print >>sys.stderr try: i = int (i) if i > 0 and i <= len (d): d = [d[i-1]] except ValueError: pass except EOFError: print >>sys.stderr sys.exit (0) data = { "strasseid": int (d[0][0]), "year" : 2012 } print "Abfallkalender: " + " ".join ([j.lower().capitalize() for j in d[0][1].split()]) for month in range (1, 13): data["month"] = month print print time.strftime ("%B %Y", time.localtime (time.mktime ((data["year"], data["month"], 1, 0, 0, 0, 0, 0, 0)))) handler = MuellHandler () handler.month = data["month"] handler.year = data["year"] datafile = urllib2.urlopen (baseurl % data) d = datafile.read().decode ('iso8859-1').encode ('utf-8') while d: handler.feed (d) d = datafile.read() print >>sys.stderr