Parser Python per pagine HTML

Python Parser HTML
Python Parser HTML in azione

Dopo (tanti) anni di studio ed un lavoro (precario) credo sia arrivata finalmente l’ora di iscrivermi all’albo degli Ingegneri, ma prima di farlo ho cercato di fare una piccola statistica su quanti ingegneri c’erano nella mia provincia (Potenza) e a quale tipo di specializzazione appartenessero.

Purtroppo lo strumento di ricerca del sito ( http://www.ordingpz.it/albo/Albolist.asp ) mette a disposizione dell’utente poche opzioni di ricerca, per tale motivo ho rispolverato la cara e vecchia libreria python Beautiful Soup per scrivere un piccolo script python il quale mi aiutasse ad effettuare il parsing di più pagine HTML e tirasse fuori i dati che mi interessavano.

Il sito in questione (http://www.ordingpz.it) ha una pagina web per ogni ingegnere iscritto all’albo. Tale pagina contiene i vari dettagli dell’ utente, compreso il campi che a me interessavano: “Settore” e “Specializzazione“.

Al seguente link è possibile avere un esempio reale del dettaglio dell’utente (l’ingegnere non è stato scelto a casa, ma è un mio amico con cui ha avuto il piacere di lavorare assieme).

http://www.ordingpz.it/albo/Alboview.asp?N__ISCR_=2714

Dalla sintassi dell’URL si capisce che ad ogni account è associato un ID (N__ISCR_) numerico univoco.

Per tale motivo il primo passo è stato quello di capire come estrapolare questi ID per poi andare a processare ogni singola pagina.

La prima parte dello script serve proprio a questo, a tirare fuori tutti gli ID dal sito.

Get ID

import urllib2
from bs4 import BeautifulSoup
import sys

f = open(‘IngPZAll.txt’, ‘w’)

url = “http://www.ordingpz.it/albo/Albolist.asp?pageno=1&t=Albo&RecPerPage=3000”
print url

try:
data = urllib2.urlopen(url).read()
except:
print url

soup = BeautifulSoup(data)

n = soup.findAll(“td”,{“width”:”100″})

#print n
numIscr = []

for i in n:
numIscr.append(i.div.string)

A questo punto la lista numIscr contiene tutti gli ID dell’albo degli Ingegneri di Potenza, adesso non ci resta che accedere alle singole pagine degli user e memorizzare tutte le informazioni che ci servono.

Il ciclo for può esterno non va altro che prendere tutti gli ID contenuti in numIscr , accedere alla pagina dell’utente ad esso associato e tramite BeautifulSoup effettuare il parsing della pagina HTML per tirare fuori le informazioni.

Parse HTML

[sourcecode language=”python”]
for i in range(len(numIscr)):
url = “http://www.ordingpz.it/albo/Alboview.asp?N__ISCR_=”+str(numIscr[i])
f.write(url+”\n”)
print “Parsing “+ str(i) + ” of ” + str(len(numIscr))
print url

try:
data = urllib2.urlopen(url).read()
except:
print url

soup = BeautifulSoup(data)
#print soup.prettify()
n = soup.findAll(“td” , “ewTableHeader”)

fields = []

for i in n:
fields.append(i.string.encode(‘ascii’,’ignore’))

n = soup.findAll(“div”)

values = [];

#print n
count = 0;

for i in n:
count=count+1;
#print count
if(i.string != None and count > 19):
#print i.string
values.append(i.string.encode(‘ascii’,’ignore’))

for i in range(len(values)):
try:
f.write(str(fields[i]+ “: “+values[i]).encode(‘utf-8’)+”\n”)
except:
print fields[i]+ “: “+values[i]

f.write(“\n”)

f.close()
[/sourcecode]

Nella lista fields saranno elencati tutti i campo della tabella (Ex. Nome, Cognome, Specializzazione ecc) ed in quella values tutti i valori dei campi prima citati. Lo step successivo è quello di scrivere tutte queste informazioni in un unico file per poi poter fare tutte le nostre statistiche in maniera semplice ed immediata.

Il file IngPZAll.txt è output dello script, ed avrà al suo interno il dettaglio di tutti gli ingegneri iscritti all’albo.

Output Example

[sourcecode language=”text”]
..
..
..
http://www.ordingpz.it/albo/Alboview.asp?N__ISCR_=2714
N Iscrizione: 2714
Cognome: MONACO
Nome: Pierpaolo
Luogo di Nascita: Potenza
Data di Nascita:
C.F.:
Indirizzo:
CAP:
Citt:
Provincia: PZ
Sezione: A
Settore: Civile ed Ambientale, Industriale, Dell’Informazione
N Iscrizione: 2714
Data Iscrizione: 04/01/2012
Specializzazione: Informatica
Sede Laurea: Roma
Data Laurea: 21/03/2011
Sede Abilitazione: Roma
Anno Abilitazione: 2011
Ordine di Provenienza: Potenza
Data Prima Iscrizione: 04/01/2012
..
..
[/sourcecode]

Ora con una semplice comando bash posso facilmente capire ciò che volevo…

[sourcecode language=”bash”]
unicondor@iMac:> grep -c “Specializzazione: Informatica” IngPZAll.txt
19
[/sourcecode]

Ecco l’informazione che cercavo, su 2506 iscritti all’albo solo 19 hanno come specializzazione Informatica 😀

Attach:

alboIngPzParser.py

IngPZAll.txt

GitHub Project:

https://github.com/flaviopace/SimplePythonHTMLParser

P.s. tutti i dati che trovate in questo articolo solo liberamente disponibili sul sito dell’albo degli Ingegneri di Potenza

Il giorno che aspetti da molto…

Keep Calm And Study hard

Di solito, le persone normali si lasciano come ultimo esame universitario uno di quelli “semplici”. Uno di quelli con professori anzianotti, magari quasi alla pensione, che a mala pena ti ascoltano e che alla fine, qualsiasi cosa dirai, ti diranno: forse potevi fare di più, comunque può andare bene così.

Ma non noi… a noi piace soffrire fine alla fine, lo scegliamo con parsimonia tra quelli piu’ tosti. Scegliamo uno dei professori piu’ giovani dell’Ateneo, uno curioso, uno che ti chiede anche il perche’ dell’utilizzo di quel carattere invece che di un altro.

E’ inutile andare a cercare motivazioni particolari da ultimo esame…ormai ci conosciamo, non ci serviranno a nulla, e allora capita che le motivazioni dobbiamo andarle a cercare nei luoghi piu’ disparati: tra gli appunti che sbucano dalle lenzuola del letto, o gli evidenziatori aperti buttati sul divano, oppure semplicemente dal fatto che ormai sei diventato grande!. Lo devi ai tuoi genitori, lo devi a te stesso… lo devi al futuro che ti attende.

L’esame e’ uno di quelli tosti, il nome da solo incute timore: Ingegneria Del Software. Soprattutto per uno come me che predilige l’architettura dei calcolatori e si trova a suo agio cazzeggiando con i puntatori del C piuttosto che analizzare la fase di Requirements Engineering ( non chiedetemi di cosa si tratti, ancora lo devo capire).

Immagino Analisti svegliarsi al mattino e parlare con i Costumers per “elicitare” i requisiti, tavole rotonde di Developer che disquisiscono su come usare l’Integration Testing e se usare una metodologia Bottom-Up o Top-Down, miriade di persone che fanno la gara a chi effettua il Bug Report piu’ dettagliato possibile… credevo che questa gente esistesse solo nella fantasia di chi scrive questi libri, invece debbo ricredermi… di gente strana ce ne molta 😀

Alla fine ci devi trovare qualcosa di interessante, devi andare avanti… e per giunta cercando di prendere un buon voto. Un voto che potrebbe alzarti o abbassarti di un punto la tua media…questa maledetta media che ogni studente universitario ha calcolato almeno un centinaio di volte. Moltiplica il voto per i crediti, fai la media pesata ecc ecc… maledetta matematica, alla fine hai sempre ragione tu.

Un ultimo accenno devo dedicarlo al gruppo con cui ho passato il mio ultimo periodo universitario, mi hanno sopportato e supportato per molti esami :D. Da ognuno di loro ho appreso qualcosa, qualcosa che non trovi scritto nei manuali o sui libri, qualcosa che mi ha reso felice di aver fatto parte del loro gruppo…. del nostro gruppo!

Grazie ad Angela, Maddalena, Mario e Rita.

Si e’ fatto tardi, e’ ora di andare a dormire, domani e’ il giorno che aspettavo da molto…