Go:
HTML Parsen

Hoe te:

Om HTML te parsen in Go, gebruik je typisch het goquery-pakket of het standaard net/html-pakket uit de bibliotheek. Hier is een basisvoorbeeld waarbij net/html wordt gebruikt om alle links van een webpagina te extraheren:

package main

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

func main() {
    // Haal HTML-document op
    res, err := http.Get("http://example.com")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    // Parse het HTML-document
    doc, err := html.Parse(res.Body)
    if err != nil {
        panic(err)
    }

    // Functie om recursief door de DOM te reizen
    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)
        }
    }

    // Doorloop de DOM
    f(doc)
}

Voorbeeldoutput (ervan uitgaande dat http://example.com twee links bevat):

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

Deze code vraagt een HTML-pagina op, parset deze en gaat recursief door de DOM om href attributen van alle <a>-tags te vinden en af te drukken.

Diepgaande duik

Het net/html-pakket biedt de basis voor het parsen van HTML in Go, door direct de tokenisatie- en boomconstructiealgoritmen te implementeren die zijn gespecificeerd door de HTML5-standaard. Deze low-level benadering is krachtig maar kan uitgebreid zijn voor complexe taken.

In tegenstelling, het third-party goquery-pakket, geïnspireerd door jQuery, biedt een hoger-niveau interface dat DOM-manipulatie en -traversering vereenvoudigt. Het stelt ontwikkelaars in staat om bondige en expressieve code te schrijven voor taken zoals elementselectie, attribuutextractie en inhoudsmanipulatie.

Echter, het gemak van goquery komt met de kosten van een extra afhankelijkheid en potentieel langzamere prestaties vanwege de abstractielaag. De keuze tussen net/html en goquery (of andere parseerbibliotheken) hangt af van de specifieke vereisten van het project, zoals de behoefte aan prestatieoptimalisatie of gebruiksgemak.

Historisch gezien is het parsen van HTML in Go geëvolueerd van basis string-operaties naar geavanceerde DOM-boommanipulatie, wat de groeiende ecosysteem van de taal en de vraag van de gemeenschap naar robuuste web scraping- en dataverkrijgingstools weerspiegelt. Ondanks de native mogelijkheden, benadrukt de prevalentie van third-party bibliotheken zoals goquery de voorkeur van de Go-gemeenschap voor modulaire, herbruikbare code. Echter, voor prestatiekritieke toepassingen kunnen programmeurs nog steeds de voorkeur geven aan het net/html-pakket of zelfs terugvallen op regex voor eenvoudige parseertaken, met in gedachten de inherente risico’s en beperkingen van op regex gebaseerde HTML-parsing.