Un esempio di machine learning: lo scraping di tabelle

Vogliamo realizzare uno script python che legga una pagina html contenente una tabella standard e ne restituisca una versione JSON riutilizzabile ed esponibile ad altri servizi web oriented.

Il web scraping

Questa tecnica prende il nome di Web Scraping e server proprio per effettuare una sorta di reverse engeneering delle pagine web per digitalizzarne il contenuto ed archiaviarlo su database per svariati scopi, in molti casi analisi di marketing o indicizzazione per motori di ricerca. Un esempio su tutti, i vari siti che permettono un confronto delle offerte di assicurazioni, alberghi o analoghi servizi “raschiano” in modo automatico i siti del settore per effettuare il confronto desiderato.

Solitamente queste operazioni sono automatizzate da opportuni script, classico esempio di Machine Learning dove la macchina apprende/prende informazioni in modo autonomo. Qui ne vediamo uno con Python e la libreria BeautifulSoup che ha gli strumenti necessari a navigare il DOM della pagina web e ricreare un JSON che ci consente una trasferibilità dei dati non strutturati raccolti per inserirli su database.

L’esempio

In questo esempio entriamo in una cartella del sito web di scuola dove sono archiviati gli orari dei docenti. Sono prodotti da un vecchio software che ha come output pagine HTML con le tabelle orarie. L’idea è di scorrere tutti i file, circa 104, estrarre le informazioni e renderle in formato JSON per poterle inserire su db. L’idea è di creare successivamente uno storico/anagrafica degli orari docente.

Un esempio del sistema un po’ primitivo dl software orario: una tabella abbastanza grossolana. Per il momento, l’esempio raschia il contenuto intero della casella, non tiene conto di informazioni specifiche come classe, materia ed eventuali docenti di supporto. Lo stesso HTML frullato dal software li elenca con un mera andata a capo che meriterebbe un ulteriore approfondimento.

Lo script

Dal punto di vista formale, lo script è abbastanza intuitivo. Gli unici elementi meno usati dallo studente probabilmente sono l’pertura dei file e l’uso dei dizionari alla riga 51 (che potete comunque leggere qui)

from bs4 import BeautifulSoup
import requests
import json

for docente in range(0,104):
    url="http://www.iisteramo.edu.it/informazioni/orario_itis/2020_21/settimana_4/Docenti/Docente"+str(docente)+".html"

    # Preleva il flusso HTML grezzo
    html_content = requests.get(url).text

    # Parse  html
    soup = BeautifulSoup(html_content, "lxml")

    table = soup.find("table")
    tr = table.find_all("tr")

    giorni = []
    primo = []
    secondo = []
    terzo = []
    quarto = []
    quinto = []
    sesto = []
    settimo = []
    orario = []

    for td in tr[0].find_all("td"):
        giorni.append(td.text.strip())  

    for td in tr[1].find_all("td"):
        primo.append(td.text.strip())  

    for td in tr[2].find_all("td"):
        secondo.append(td.text.strip())  

    for td in tr[3].find_all("td"):
        terzo.append(td.text.strip())  

    for td in tr[4].find_all("td"):
        quarto.append(td.text.strip())  

    for td in tr[5].find_all("td"):
        quinto.append(td.text.strip())  

    for td in tr[6].find_all("td"):
        sesto.append(td.text.strip())  

    for td in tr[7].find_all("td"):
        settimo.append(td.text.strip())

    data = {0:giorni, 1:primo, 2:secondo, 3:terzo,  4:quarto, 5:quinto, 6:sesto, 7:settimo}

    file = "json"+str(docente)+".json"
    f = open(file,'w')
    json.dump(data, f)
    f.close()

Ultima modifica 16 Ottobre 2023