Riprendiamoci i CAP, uno per uno

Update:

Oggi 13/10/2006 la Free Software Foundation Europe pubblica il database contenente l’elenco aggiornato dei nuovi CAP italiani ([leggi articolo](http://www.italy.fsfeurope.org/it/projects/cap/)). Il database può essere consultato velocemente con la nuova versione 0.2.0 di [trovacap](http://www.digitazero.org/?p=41#DOWNLOAD).
I CAP presenti nell’archivio potrebbero non essere completamente corretti, penso sia comunque una bella lezione al [CDA](http://www.poste.it/azienda/cda.shtml) di una azienda a maggioranza pubblica che:

* cambia i CAP con minimo preavviso, creando il panico nelle grandi aziende e negli uffici pubblici,
* vende i cambiamenti fatti!!

Infatti è ammirevole il tempo record in cui questi CAP sono stati liberati dalla pacifica popolazione dei programmatori italiani… che però a volte si incazzano!

Update:

Approccio sbagliato! Non serve riscaricare tutto, basta prendere una strada per CAP dal DB e cercare quella. In questo modo con poche migliaia di query avremo la tabella Hash-CAP.

Io non ho il CD e non glielo compro!

Comunque per chi fosse ancora interessato…

Scaricate


(http://www.python.org) e [BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/) prima di eseguire.

Esempio:

>>> dumpStrade("50126")
>>>
[u'ADRIANI (VIA)',
 u'ALBANIA (VIA)',
 u"ALBERETA (VIALE DELL')",
...
 u'VILLAMAGNA (VIA DI)',
 u'ZANOBI DA STRADA (VIA)']

Poi qualcuno potrebbe fare un bel servizio online REST con la cache, visto che il sito delle poste è una vergogna…

Sorgenti:

import urllib, re, time
import BeautifulSoup

#versione 0.3

def getPage(cap, page):
    post = urllib.urlencode({"loc":"", "provincia":"", "indirizzo":"", "cap":cap})
    cercacap = "http://www.poste.it/online/cercacap/risultato.php?page=%d" % page
    u = urllib.urlopen(cercacap, data=post)
    try:
        h = u.read()
    except:
        print "Riprova tra 5 secondi..."
        time.sleep(5)
        return getPage(cap, page)
    s = BeautifulSoup.BeautifulSoup(h)
    if s.find(text=cap) != None:
        return s
    else:
        #una volta su due da errore... quindi si riprova...
        print "Riprova tra 5 secondi..."
        time.sleep(5)
        return getPage(cap, page)

def dumpStrade(cap):
    print "Sto scaricando le strade associate al cap %s" % cap
    s = getPage(cap, 1)
    comune = s.find(text=re.compile("Comune:.*"))
    print comune
    #L'ultimo search(nnn) che non e' nnn=2 e' il numero di pagine totale
    pages = int(s.findAll("a", href=re.compile("javascript:search\([^2]*\)"))[-1].string)
    print "Le strade sono presentate in %d pagine" % pages
    res = []
    for page in range(1, 1+pages):
        print "Scaricando la pagina %d/%d" % (page, pages)
        s = getPage(cap, page)
        for tr in s.body.div.table.findAll("tr"):
           if tr.find(text=cap):
               #se nel tr c'e' il CAP, allora il primo td contiene la via
               res.append(tr.td.string)
               # TODO gestire i civici
        print "Attendi 5 secondi..."
        time.sleep(5)
    print "Fatto"
    return comune, cap, res

Questo codice (pietoso, lo so, ma *release early*) è rilasciato al pubblico dominio… come dovrebbero essere i CAP.

Vergogna al **[Consiglio di Amministrazione](http://www.poste.it/azienda/cda.shtml)**:

* Presidente: Vittorio Mincato
* Vice Presidente Delegato: Nunzio Guglielmino
* Amministratore Delegato: Massimo Sarmi

Mi ricorderò dei vostri nomi!

Altre info:

* [Trovacap](http://www.digitazero.org/?p=41) software per la ricerca dei CAP, funzionante fino al giorno del misfatto.
* [Petizione On-Line](http://www.petitiononline.com/freecap/petition.html)
* Articolo sull’Unità, [Quei CD dei CAP](http://www.unita.it/view.asp?IDcontent=59883)
* Articolo di Punto Informatico, [Poste.it, i nuovi CAP.. discriminano?](http://punto-informatico.it/p.aspx?id=1657114&r=PI)