Parsing HTML en Go (Golang) : outils et exemples pratiques
Go (Golang) est un langage compilé, typé statiquement, créé chez Google. Grâce à ses hautes performances, son support intégré de la concurrence et sa riche bibliothèque standard, Go est devenu l'un des meilleurs langages pour le web scraping et le parsing HTML. Dans cet article, nous passerons en revue les principales bibliothèques pour travailler avec des documents HTML en Go, donnerons des exemples de code et comparerons leurs fonctionnalités.
Pourquoi parser du HTML en Go ?
Le parsing HTML est nécessaire pour extraire des données de pages web : actualités, prix, informations de contact, résultats de recherche. Go est parfaitement adapté à cette tâche grâce à :
- Sa grande vitesse d'exécution (compilation en code machine)
- Sa facilité de travail avec le réseau (package intégré
net/http) - Sa simplicité d'analyse de l'arbre DOM via des bibliothèques spécialisées
- Son excellent support du multithreading (goroutines et canaux)
Bibliothèques principales pour le parsing HTML en Go
1. net/html — bibliothèque standard
golang.org/x/net/html est un tokeniseur et analyseur HTML de bas niveau issu de la bibliothèque standard de Go. Il offre un contrôle total sur le processus d'analyse, mais nécessite d'écrire plus de code.
Exemple : extraction de tous les liens (<a href>) d'un document HTML.
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)}Avantages : ne nécessite pas l'installation de packages tiers, contrôle total. Inconvénients : beaucoup de code passe-partout, peu pratique pour les sélecteurs complexes.
2. goquery — syntaxe similaire à jQuery
github.com/PuerkitoBio/goquery est la bibliothèque la plus populaire pour le parsing HTML en Go. Elle fournit une API similaire à jQuery : Find(), Each(), Attr(), Text().
Exemple : parsing des titres d'actualités d'un site.
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 Lien : %s", i+1, title, link) })}Avantages : syntaxe simple, support des sélecteurs CSS, documentation riche. Inconvénients : ne convient pas aux très grands documents (charge tout en mémoire).
3. colly — framework de web scraping
github.com/gocolly/colly est un puissant framework de collecte de données. Il inclut le parsing HTML (basé sur goquery), la gestion de la file d'attente des requêtes, le traitement des cookies, les limites de vitesse et bien plus encore.
Exemple : collecte de tous les liens de la première page d'un site avec un délai entre les requêtes.
package main
import ( "fmt" "github.com/gocolly/colly/v2")
func main() { c := colly.NewC Aussi dans la bibliothèque
Génération de rapports PDF en C# (.NET) : iTextSharp, QuestPDF, PDFsharp
Cryptographie en TypeScript : Aperçu de la bibliothèque crypto-js
Validation des données en Rust : bibliothèques et approches pour un code fiable
Actix-web pour Rust : guide complet avec exemples