Tutorial a richiesta: gdrive, IMPORTXML e XPath

Un piccolo esempio per il monitoraggio dei contenuti di una pagina web

Andrea Borruso
Jan 14, 2017 · 3 min read

Il 13 gennaio del 2017 Laura Strano ha pubblicato un messaggio in cui mostrava come il Comune di Messina non adempia in modo pieno agli obblighi di pubblicazione dei curriculum e delle retribuzioni dei propri dirigenti.

Aprendo la pagina web dedicata potrebbe sembrare che siano tutti pubblicati, perché nella colonna dedicata è presente — per tutti i dirigenti — la classica icona per il download del file in formato PDF. Ma non è così e in 4 casi c’è soltanto l’icona e nessun curriculum associato.
Questa scelta di impaginazione brutta, non comprensibile e opaca mi ha stimolato la voglia di dare un piccolo contributo all'azione civica di Laura: ho costruito un foglio elettronico che estrae automaticamente i nomi delle persone per cui non è ancora pubblicato il CV e che si aggiornerà automaticamente se e quando verranno aggiunti nel tempo i file mancanti.

Il foglio non ha nella fattispecie una grande utilità, ma ha suscitato interesse per le modalità con cui riesce a estrapolare queste informazioni dalla pagina sorgente e per questo sto scrivendo questo breve tutorial.

Come funziona

In Google Drive, il foglio elettronico di Google Suite, è disponibile la funzione IMPORTXML, che consente di importare dati da vari tipi di dati strutturati, tra cui XML, HTML, CSV, TSV e feed XML RSS e ATOM, e quindi anche da una pagina web.

La sintassi è:

IMPORTXML(url; query_xpath) 

Il primo argomento è l’URL della pagina da cui estrarre i dati, quindi la pagina del Comune di Messina.

Il secondo argomento è una query XPath, da eseguire sulla pagina. Si tratta di un linguaggio per estrarre delle porzioni specifiche di un file XML/HTML. Tante risorse per studiare questo linguaggio: un buon punto di partenza è questo.

Ad esempio per una pagina web si possono costruire delle query per estrarre:

  • tutti i titoli presenti e gli hyperlink degli stessi;
  • gli URL di una sezione particolare (ad tutti quelli della classica sezione “ultime notizie”);
  • tutti i tag associati alle foto;
  • ecc..

In questo caso l’obiettivo è quello di estrarre le informazioni contenute nelle righe a cui non è associato, per la colonna “Curriculum vitae”, alcun PDF. In questo caso la query di base è:

//tbody/tr[not(descendant::td[4]//a/@href)]

Scomponendola da sinistra verso destra:

  • si parte da tbody, il corpo della tabella;
  • poi tr ovvero le righe contenute;
  • poi la condizione che applica il filtro e che fa in modo che vengano selezionate soltanto quelle righe in cui la IV colonna (td in HTML) non contiene un hyperlink (quello al PDF del CV), [not(descendant::td[4]//a/@href)]

Quest’ultima parte è apparentemente più complessa, ma in realtà se la si legge è quasi autoesplicativa:

  • “not” per non;
  • “descendant”, ovvero gerarchicamente discendente, ovvero figlio di tr (una riga della tabella);
  • la IV colonna “td[4]”;
  • “a”, ovvero il tag <a>, quindi gli hyperlink;
  • “@href” la proprietà href del tag <a>, quindi l’indirizzo per il download dei PDF;

In altre parole le righe che NON hanno un tag <a> all'interno della IV colonna. In questo modo vengono estratte solo le righe di interesse.

Nel foglio elettronico sono state estratte 4 informazioni e inserite in 4 colonne, utilizzando quattro formule distinte. Per estrarre ad esempio la prima colonna — quella con nome e cognome del dirigente — basta aggiungere la stringa “ /*[1]”, ovvero il primo elemento figlio di tr, che è la colonna “ Nominativo”. Nel foglio elettronico, nella cella A2 la formula è quindi:

=IMPORTXML("http://www.comune.messina.it/amministrazione-trasparente/personale/dirigenti.aspx","//tbody/tr[not(descendant::td[4]//a/@href)]/*[1]")

Infine, per fare in modo che il foglio venga aggiornato automaticamente in modo periodico, è necessario aprire le impostazioni del foglio e scegliere l’opzione sottostante (verrà eseguito un ricalcolo ogni ora).

L’XPath è un linguaggio di grande comodità e propedeutico per chi deve estrarre contenuti da pagine web. Questo tutorial è solo una “annusata” per fare venire voglia di iniziarlo a “masticare”.

Andrea Borruso

Written by

#data #maps #GIS #baci #condivisione. Orgoglioso di essere presidente di @ondatait