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:
>>>
[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 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)