HTML-Parsing in Go (Golang): Überblick über Bibliotheken und praktische Beispiele
Go (Golang) ist eine kompilierte, statisch typisierte Sprache, die sich hervorragend für die Erstellung leistungsstarker Web-Scraping-Tools und zum HTML-Parsing eignet. Die integrierte Standardbibliothek net/html bietet einen Low-Level-Tokenizer, aber für die komfortable Arbeit mit dem DOM-Baum und CSS-Selektoren werden häufiger Drittanbieter-Pakete verwendet. In diesem Artikel betrachten wir drei wichtige Werkzeuge: goquery, colly und das Standardpaket net/html. Sie erfahren, wie Sie das passende Werkzeug auswählen, und sehen funktionierende Codebeispiele.
1. Die Standardbibliothek: net/html
Das Paket golang.org/x/net/html bietet einen Tokenizer und Parser für HTML. Es implementiert die HTML5-Spezifikation und ermöglicht das Parsen eines Dokuments in einen Knotenbaum. Dies ist die leichteste und schnellste Option, erfordert jedoch mehr Code für die Navigation.
Beispiel: Extrahieren aller Links (<a href>) von einer Seite:
package main
import ( "fmt" "golang.org/x/net/html" "net/http" "strings")
func main() { resp, _ := http.Get("https://example.com") defer resp.Body.Close()
doc, _ := html.Parse(resp.Body)
var links []string var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for _, attr := range n.Attr { if attr.Key == "href" { links = append(links, attr.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc)
fmt.Println(strings.Join(links, ""))}Vorteile: minimale Abhängigkeiten, hohe Geschwindigkeit.
Nachteile: keine CSS-Selektoren, rekursive Traversierung muss selbst geschrieben werden.
2. goquery — jQuery für Go
goquery ist die beliebteste Bibliothek zum HTML-Parsing in Go. Sie verwendet net/html im Hintergrund und fügt eine jQuery-ähnliche Syntax hinzu. Sie können CSS-Selektoren zur Elementauswahl, Methodenverkettung und DOM-Manipulation nutzen.
Installation:
go get github.com/PuerkitoBio/goqueryBeispiel: Sammeln von Artikelüberschriften von einem Blog:
package main
import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")
func main() { resp, err := http.Get("https://habr.com/ru/all/") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }
doc.Find("article h2").Each(func(i int, s *goquery.Selection) { title := s.Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s %s", i+1, title, link) })}Wichtige goquery-Methoden:
Find(selector)— Elemente nach CSS-Selektor suchenEach(func)— Iteration über gefundene ElementeAttr(name)— Attributwert abrufenText()— Textinhalt extrahierenHtml()— HTML-Code innerhalb des Elements abrufen
goquery ist ideal für schnelles Prototyping und das Parsen von Seiten mit komplexer Struktur. Beachten Sie jedoch: Es unterstützt keine JavaScript-Ausführung — es ist ein Werkzeug für statisches HTML.
3. Colly — Framework für Web-Scraping
Colly ist ein leistungsstarkes Framework, das nicht nur HTML-Parsing (über goquery), sondern auch die Verwaltung von Anfragewarteschlangen, die Arbeit mit Cookies und Limits umfasst.
Auch in der Bibliothek
reflect-metadata für TypeScript: Komplettguide mit Beispielen
gRPC für C# (.NET): Bibliotheken, Einrichtung und Codebeispiele
league/csv für PHP: Komplette Anleitung mit Beispielen