HTML-Parsing in Go (Golang): Werkzeuge und praktische Beispiele
Go (Golang) ist eine kompilierte, statisch typisierte Sprache, die bei Google entwickelt wurde. Dank hoher Leistung, integrierter Unterstützung für Nebenläufigkeit und einer umfangreichen Standardbibliothek ist Go eine der besten Sprachen für Web-Scraping und HTML-Parsing. In diesem Artikel behandeln wir die wichtigsten Bibliotheken für die Arbeit mit HTML-Dokumenten in Go, zeigen Codebeispiele und vergleichen ihre Funktionen.
Warum HTML in Go parsen?
HTML-Parsing ist notwendig, um Daten aus Webseiten zu extrahieren: Nachrichten, Preise, Kontaktinformationen, Suchergebnisse. Go eignet sich hervorragend für diese Aufgabe dank:
- Hoher Ausführungsgeschwindigkeit (wird in Maschinencode kompiliert)
- Einfacher Netzwerkarbeit (integriertes Paket
net/http) - Einfacher Analyse des DOM-Baums durch spezialisierte Bibliotheken
- Hervorragender Unterstützung für Multithreading (Goroutinen und Kanäle)
Wichtige Bibliotheken für HTML-Parsing in Go
1. net/html — Standardbibliothek
golang.org/x/net/html ist ein Low-Level-Tokenizer und Parser für HTML aus der Go-Standardbibliothek. Er bietet vollständige Kontrolle über den Analyseprozess, erfordert aber das Schreiben von mehr Code.
Beispiel: Extrahieren aller Links (<a href>) aus einem HTML-Dokument.
package main
import ( "fmt" "golang.org/x/net/html" "net/http" "log")
func main() { resp, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := html.Parse(resp.Body) if err != nil { log.Fatal(err) }
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" { fmt.Println(attr.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc)}Vorteile: Keine Installation von Drittanbieter-Paketen erforderlich, volle Kontrolle. Nachteile: Viel Boilerplate-Code, unpraktisch für komplexe Selektoren.
2. goquery — jQuery-ähnliche Syntax
github.com/PuerkitoBio/goquery ist die beliebteste Bibliothek für HTML-Parsing in Go. Sie bietet eine API ähnlich wie jQuery: Find(), Each(), Attr(), Text().
Beispiel: Parsen von Nachrichtenüberschriften von einer Website.
package main
import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")
func main() { resp, err := http.Get("https://habr.com/ru/news/") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }
doc.Find("h2.tm-article-snippet__title").Each(func(i int, s *goquery.Selection) { title := s.Find("a").Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s Link: %s", i+1, title, link) })}Vorteile: Einfache Syntax, Unterstützung für CSS-Selektoren, umfangreiche Dokumentation. Nachteile: Nicht geeignet für sehr große Dokumente (lädt alles in den Speicher).
3. colly — Framework für Web-Scraping
github.com/gocolly/colly ist ein leistungsstarkes Framework für die Datensammlung. Es umfasst HTML-Parsing (basierend auf goquery), Verwaltung der Anfragewarteschlange, Cookie-Handling, Geschwindigkeitsbegrenzungen und vieles mehr.
Beispiel: Sammeln aller Links von der ersten Seite einer Website mit Verzögerung zwischen den Anfragen.
package main
import ( "fmt" "github.com/gocolly/colly/v2")
func main() { c := colly.NewC