sabato 16 marzo 2019

scraping dei documenti pdf dall'Albo Pretorio tipo Maggioli con google sheets

Analizzando con Ispeziona Elemento una pagina d'arrivo della comunicazione dell'Albo Pretorio, si osservano le seguenti caratteristiche.



l'XPath per arrivare alla tabella dei documenti è:
//*[@id='p_p_id_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_']/div/div[2]/div/div[2]/table/tr

gli apici singoli servono a non far confondere googlesheet

l'XPath qui sopra serve a listare le intestazioni della tabella:



TitoloDescrizioneScarica
det_00262_15-03-2019.pdf - originale pdfDocumento principale
parere tecnico - firma digitaleAllegato parte integrante
Attestazione e regolarità digitale - firma digitaleAllegato parte integrante
Determinazione n. 00262/2019Allegato parte integrante

per listare invece i link a ciascun documento occorre tenere presente che l'Xpath
//*[@id='p_p_id_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_']/div/div[2]/div/div[2]/table/tr[2]/td[3]/a/@href
genererà due link , uno per il doc firmato e uno per quello non firmato


per passare da un doc all'altro cambia il tr[XX], ma il td resta sempre il terzo td[3]
alcuni doc hanno un solo doc, altri due: firmato oppure no
il secondo è quello non firmato, m l'id dei due è lo stesso
nell'Xpath non bisogna mettere il livello tbody del table, anche se IspezionaElemento include tbody
nell'Xpath id usare apici singoli, i doppi servono a importxml di google

il fatto che siano 4, è riportato nella pagina dell'Albo Pretorio di partenza , xpath: //td[5]
=IMPORTxML(A1;"//td[5]")
dove A1 era al solito:
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap/-/papca/igrid/1489180872/1489180071

i 4 doc si estraggono usando come _query di importxml queste:
//*[@id='p_p_id_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_']/div/div[2]/div/div[2]/table/tr[2]/td[3]/a/@href
//*[@id='p_p_id_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_']/div/div[2]/div/div[2]/table/tr[3]/td[3]/a/@href
//*[@id='p_p_id_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_']/div/div[2]/div/div[2]/table/tr[4]/td[3]/a/@href
//*[@id='p_p_id_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_']/div/div[2]/div/div[2]/table/tr[5]/td[3]/a/@href

questi xpath generano 7 link a pdf: il primo un solo link, gli altri due ciascuno.

Si osserva che i link sono molto lunghi, ma differiscono solo in due posizioni, utile a sapersi per automatizzare lo scraping:

  • dove c'è scritto false come valore di signed (dal carattere 308)
  • dove c'è l'identificativo del documento (lo stesso per signed e non signed) : dal carattere 367 se c'era true o dal carattere 368 se c'era false:
=STRINGA.ESTRAI(F15;SE(H15="firmato";367;368);7)
o meglio:
=STRINGA.ESTRAI(F13;SE(STRINGA.ESTRAI(F13;308;5)="true&";367;368);7)
dove F13 contiene il link al documento e viene restituito l'id del documento:

http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=true&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761769&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761769
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=true&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761770&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761770
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=false&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761770&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761770
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=true&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761771&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761771
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=false&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761771&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761771
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=true&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761772&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761772
http://crema.trasparenza-valutazione-merito.it/web/trasparenza/papca-ap?p_p_id=jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet&p_p_lifecycle=2&p_p_state=pop_up&p_p_mode=view&p_p_resource_id=downloadAllegato&p_p_cacheability=cacheLevelPage&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_downloadSigned=false&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_id=7761772&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_action=mostraDettaglio&_jcitygovalbopubblicazioni_WAR_jcitygovalbiportlet_fromAction=recuperaDettaglio7761772

link al gsheet delle prove: 



venerdì 15 marzo 2019

da Albo Pretorio a AlboPOP a Facebook Page

Questo post descrive come estrarre informazioni dall'Albo Pretorio di Crema (formato "Maggioli") per ottenere un AlboPOP (RSS feed in formato specificato dalla Comunità di AlboPOP) e successivamente, sfruttando IFTTT, caricare le notizie da RSS in una pagina Facebook apposita.

Passo 1: da Albo Pretorio a AlboPOP

Partenza: video tutorial : dove si spiegano i concetti fondamentali



Il foglio googlesheet coi campi riempiti partendo dall'Albo "tipo Maggioli".


Lo script integrato nel foglio (Copyright 2016 Matteo Fortini) ci dice cosa serve:

/* This script assumes to use a spreadsheet with this form:
 *
 * - A sheet named "clean" in which there are three columns, with a header in row 1:
 *   - TITLE: the title of the record
 *   - PUBDATE: the publication date in a format parseable by JavaScript's Date() function
 *   - HREF: the link to the news
 * - A sheet named "meta" in which:
 *   - cell G1 will be used as the RSS feed title
 *   - cell G2 will be used as the RSS feed URL
 *   - cell G3 will be used as the RSS feed description
 *
 * The ID for the spreadsheet is a code that can be extracted from GDrive URL, e.g.
 * for the URL https://docs.google.com/spreadsheets/d/1VgASeOEyGKvpvMa8yWHBWsobgQw4hUK42xtMQvlO7Po/edit
 * the ID is 1VgASeOEyGKvpvMa8yWHBWsobgQw4hUK42xtMQvlO7Po

 */

QUINDI: ci sono 3 fogli.
Il primo ("raccolta"), non toccare, serve a caricare dall'Albo Pretorio le informazioni. Userà la cella B1 del terzo foglio come indirizzo dove andare a prendere le informazioni.
Il secondo ("clean") è compilato automaticamente dal gsheet
Il terzo ("meta") va compilato a mano inserendo le informazioni relative al Comune.

Nel terzo foglio bisogna semplicemente mettere nella casella B1 l'URL dell'Albo Pretorio.
Compilare poi i campi della colonna G (latitudine, longitudine e il codice istat per G12 si trovano su wikipedia , pagina del Comune), tranne che per il campo G2 dove occorre prima andare allo script.
Menu Strumenti=> Editor di Script
Nello script occorre 
1) sostituire nella riga 38 il codice identificativo con quello del googlesheet in uso (occorre copiarlo dalla casella in alto nel browser, dall'URL della pagina aperta, come spiegato nel video):

ID_SPREADSHEET="1T1twNaCm1iFoy92StwmZpdpcz5tpeqIROXQafWOXuJM";

2) Menu Pubblica => Distribuisci Come Applicazione Web : copiare l'URL proposto, tornare nel Foglio e incollarlo nella casella G2 del foglio metaQUESTO URL E' IL FEED RSS , che bisognerà poi copiare , nel passo 2 (vedi sotto), nella casella del trigger della applet IFTTT, e che si comunica alla Community di AlboPOP se si desidera includere l'AlboPOP (RSS) nella lista dei Comuni seguiti.


Passo 2: da AlboPOP a pagina Facebook
Creare la pagina Facebook dell'AlboPOP.
Tenere aperto facebook sulla nuova pagina (in cui verranno postate in automatico le comunicazioni dell'Albo Pretorio).

Andare su IFTTT, registrarsi e creare una applet (NewApplet) scegliendo come innesco (cliccare IF this)  FEED RSS, poi "new  feed item" e incollare  l'URL del RSS copiato sopra   e poi create trigger e come azione (THEN THAT)  FacebookPage.
Aggiungere ingrediente al campo  linkURL cliccando  EntryURL
Aggiungere nel campo messaggio l'EntryTitle e altre info a piacere che si vogliono vedere nel post.




salvare (SAVE) la applet (che sarà attiva , ON, verde).