HTML-Parsing in Go (Golang): Überblick über Werkzeuge und Beispiele
Go (Golang) ist eine kompilierte, statisch typisierte Programmiersprache von Google, die sich ideal für die Erstellung leistungsstarker Parser und Web-Scraper eignet. Dank der integrierten Unterstützung für Nebenläufigkeit (Goroutinen) und der umfangreichen Standardbibliothek ermöglicht Go die effiziente Verarbeitung von HTML-Dokumenten jeder Komplexität. In diesem Artikel betrachten wir die wichtigsten Bibliotheken zum HTML-Parsing in Go, ihre Möglichkeiten und geben praktische Codebeispiele.
Standardbibliothek: net/html
Das Paket golang.org/x/net/html ist die Grundlage für die Arbeit mit HTML in Go. Es bietet einen Tokenizer und einen Parser, der den DOM-Baum des Dokuments erstellt. Dies ist ein Low-Level-Werkzeug, das die volle Kontrolle über den Analyseprozess gibt, aber für typische Aufgaben mehr Code erfordert.
Beispiel für die Verwendung von net/html zum Extrahieren aller Links aus einem HTML-Dokument:
package main
import ( "fmt" "golang.org/x/net/html" "strings")
func main() { htmlContent := `<html><body><a href="/page1">Link 1</a><a href="/page2">Link 2</a></body></html>` doc, _ := html.Parse(strings.NewReader(htmlContent)) 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) for _, link := range links { fmt.Println(link) }}Dieser Code durchläuft rekursiv den DOM-Baum, findet alle <a>-Tags und extrahiert den Wert des Attributs href. Die Methode ist einfach und zuverlässig, aber für komplexere Aufgaben (z. B. Suche mit CSS-Selektoren) sind spezialisierte Bibliotheken besser geeignet.
Bibliothek goquery: jQuery für Go
github.com/PuerkitoBio/goquery ist die beliebteste Bibliothek zum HTML-Parsing in Go. Sie bietet eine an jQuery erinnernde API: Elementauswahl mit CSS-Selektoren, Methodenverkettung, DOM-Manipulation. Das macht den Code prägnant und lesbar.
Installation:
go get github.com/PuerkitoBio/goqueryBeispiel für das Parsen einer Seite mit Extraktion von Überschriften und Links:
package main
import ( "fmt" "log" "net/http"
"github.com/PuerkitoBio/goquery")
func main() { // HTML-Seite laden res, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer res.Body.Close()
// HTML parsen doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) }
// h2-Überschriften extrahieren doc.Find("h2").Each(func(i int, s *goquery.Selection) { fmt.Printf("Überschrift %d: %s", i+1, s.Text()) })
// Alle Links extrahieren doc.Find("a").Each(func(i int, s *goquery.Selection) { link, _ := s.Attr("href") text := s.Text() fmt.Printf("Link %d: %s (%s)", i+1, text, link) })}Wichtige Funktionen von goquery:
- CSS-Selektoren: Unterstützung aller Standardselektoren (Klassen, IDs, Attribute, Pseudoklassen).
- Methodenverkettung:
Find().Filter().Each()— Code wird wie in jQuery geschrieben. - Datenextraktion: Methoden
Text(),Html(),Attr(). - DOM-Manipulation:
SetText(),SetHtml(),Append().
Für die Arbeit mit großen Datenmengen ist goquer
Auch in der Bibliothek
Swagger/OpenAPI-Generierung für JavaScript (Node.js) — Werkzeuge und Bibliotheken
csv für Rust: vollständige Anleitung mit Beispielen
mapstructure für Go: Vollständige Anleitung mit Beispielen
Aufgabenplaner in Rust: Erstellung eines zuverlässigen Job Schedulers
Redis-Client für Rust: Überblick über die Bibliothek redis-rs