Go:
HTML parsen

Wie:

Um HTML in Go zu parsen, verwendet man üblicherweise das goquery-Paket oder das Standardbibliothekspaket net/html. Hier ist ein einfaches Beispiel, das net/html verwendet, um alle Links von einer Webseite zu extrahieren:

package main

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

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

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

    // Funktion zur rekursiven Durchquerung des 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)
        }
    }

    // Den DOM durchqueren
    f(doc)
}

Beispielausgabe (angenommen, http://example.com enthält zwei Links):

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

Dieser Code fordert eine HTML-Seite an, parst sie und durchläuft rekursiv den DOM, um href-Attribute aller <a>-Tags zu finden und auszudrucken.

Vertiefung

Das net/html-Paket bietet die Grundlagen für das Parsen von HTML in Go und implementiert direkt die Tokenisierungs- und Baumkonstruktionsalgorithmen, die durch den HTML5-Standard spezifiziert sind. Dieser low-level Ansatz ist leistungsfähig, kann aber für komplexe Aufgaben umfangreich sein.

Im Gegensatz dazu bietet das Drittanbieterpaket goquery, inspiriert von jQuery, eine höherstufige Schnittstelle, die DOM-Manipulation und -Durchquerung vereinfacht. Es ermöglicht Entwicklern, prägnanten und ausdrucksstarken Code für Aufgaben wie Elementauswahl, Attributextraktion und Inhaltsmanipulation zu schreiben.

Die Bequemlichkeit von goquery geht jedoch auf Kosten einer zusätzlichen Abhängigkeit und potenziell langsamerer Leistung durch seine Abstraktionsschicht. Die Wahl zwischen net/html und goquery (oder anderen Parsingsbibliotheken) hängt von den spezifischen Anforderungen des Projekts ab, wie beispielsweise dem Bedarf an Leistungsoptimierung oder Benutzerfreundlichkeit.

Historisch gesehen hat sich das HTML-Parsing in Go von einfachen Stringoperationen zu ausgeklügelten DOM-Baummanipulationen entwickelt, was das wachsende Ökosystem der Sprache und die Nachfrage der Community nach robusten Werkzeugen für Web Scraping und Datengewinnung widerspiegelt. Trotz der nativen Fähigkeiten zeigt die Verbreitung von Drittanbieterbibliotheken wie goquery die Präferenz der Go-Community für modularen, wiederverwendbaren Code. Für leistungsorientierte Anwendungen bevorzugen Programmierer jedoch möglicherweise immer noch das net/html-Paket oder greifen sogar für einfache Parsingaufgaben auf Regex zurück, wobei sie die inhärenten Risiken und Beschränkungen des auf Regex basierenden HTML-Parsings im Auge behalten.