Go:
Analisi del HTML

Come fare:

Per analizzare l’HTML in Go, si utilizza tipicamente il pacchetto goquery o il pacchetto della libreria standard net/html. Ecco un esempio base che utilizza net/html per estrarre tutti i link da una pagina web:

package main

import (
    "fmt"
    "golang.org/x/net/html"
    "net/http"
)

func main() {
    // Ottenere il documento HTML
    res, err := http.Get("http://example.com")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    // Analizzare il documento HTML
    doc, err := html.Parse(res.Body)
    if err != nil {
        panic(err)
    }

    // Funzione per attraversare ricorsivamente il DOM
    var f func(*html.Node)
    f = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "a" {
            for _, a := range n.Attr {
                if a.Key == "href" {
                    fmt.Println(a.Val)
                    break
                }
            }
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            f(c)
        }
    }

    // Attraversare il DOM
    f(doc)
}

Output di esempio (assumendo che http://example.com contenga due link):

http://www.iana.org/domains/example
http://www.iana.org/domains/reserved

Questo codice richiede una pagina HTML, la analizza e attraversa ricorsivamente il DOM per trovare e stampare gli attributi href di tutti i tag <a>.

Approfondimento

Il pacchetto net/html fornisce le basi per l’analisi dell’HTML in Go, implementando direttamente gli algoritmi di tokenizzazione e costruzione dell’albero specificati dallo standard HTML5. Questo approccio di basso livello è potente ma può risultare verboso per compiti complessi.

Al contrario, il pacchetto di terze parti goquery, ispirato a jQuery, offre un’interfaccia di livello superiore che semplifica la manipolazione e l’attraversamento del DOM. Consente agli sviluppatori di scrivere codice conciso ed espressivo per compiti come la selezione di elementi, l’estrazione di attributi e la manipolazione dei contenuti.

Tuttavia, la comodità di goquery comporta il costo di una dipendenza aggiuntiva e potenzialmente prestazioni più lente a causa del suo strato di astrazione. La scelta tra net/html e goquery (o altre librerie di analisi) dipende dai requisiti specifici del progetto, come la necessità di ottimizzazione delle prestazioni o la facilità d’uso.

Storicamente, l’analisi dell’HTML in Go è evoluta dalle operazioni di base sulle stringhe alla sofisticata manipolazione degli alberi DOM, riflettendo la crescita dell’ecosistema del linguaggio e la domanda della comunità per robusti strumenti di scraping web e estrazione di dati. Nonostante le capacità native, la prevalenza di librerie di terze parti come goquery evidenzia la preferenza della comunità Go per codice modulare e riutilizzabile. Tuttavia, per applicazioni critiche per le prestazioni, i programmatori potrebbero ancora preferire il pacchetto net/html o persino ricorrere a regex per semplici compiti di analisi, tenendo presente i rischi e i limiti intrinseci dell’analisi HTML basata su regex.