Parsing HTML en Go (Golang) : aperçu des outils et exemples
Go (Golang) est un langage de programmation compilé, typé statiquement, développé par Google, idéal pour créer des parseurs et des scrapers web haute performance. Grâce à son support natif de la concurrence (goroutines) et à sa riche bibliothèque standard, Go permet de traiter efficacement des documents HTML de toute complexité. Dans cet article, nous examinerons les principales bibliothèques pour le parsing HTML en Go, leurs fonctionnalités et fournirons des exemples pratiques de code.
Bibliothèque standard : net/html
Le package golang.org/x/net/html est la base pour travailler avec HTML en Go. Il fournit un tokenizer et un parseur qui construit l'arbre DOM du document. C'est un outil de bas niveau offrant un contrôle total sur le processus d'analyse, mais nécessitant plus de code pour les tâches courantes.
Exemple d'utilisation de net/html pour extraire tous les liens d'un document HTML :
package main
import ( "fmt" "golang.org/x/net/html" "strings")
func main() { htmlContent := `<html><body><a href="/page1">Lien 1</a><a href="/page2">Lien 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) }}Ce code parcourt récursivement l'arbre DOM, trouve toutes les balises <a> et extrait la valeur de l'attribut href. La méthode est simple et fiable, mais pour des tâches plus complexes (par exemple, la recherche par sélecteurs CSS), il est préférable d'utiliser des bibliothèques spécialisées.
Bibliothèque goquery : jQuery pour Go
github.com/PuerkitoBio/goquery est la bibliothèque la plus populaire pour le parsing HTML en Go. Elle fournit une API rappelant jQuery : sélection d'éléments par sélecteurs CSS, chaînage de méthodes, manipulations du DOM. Cela rend le code concis et lisible.
Installation :
go get github.com/PuerkitoBio/goqueryExemple de parsing d'une page avec extraction des titres et des liens :
package main
import ( "fmt" "log" "net/http"
"github.com/PuerkitoBio/goquery")
func main() { // Chargement de la page HTML res, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer res.Body.Close()
// Parsing du HTML doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) }
// Extraction des titres h2 doc.Find("h2").Each(func(i int, s *goquery.Selection) { fmt.Printf("Titre %d : %s", i+1, s.Text()) })
// Extraction de tous les liens doc.Find("a").Each(func(i int, s *goquery.Selection) { link, _ := s.Attr("href") text := s.Text() fmt.Printf("Lien %d : %s (%s)", i+1, text, link) })}Fonctionnalités clés de goquery :
- Sélecteurs CSS : support de tous les sélecteurs standards (classes, ID, attributs, pseudo-classes).
- Chaînage de méthodes :
Find().Filter().Each()— le code s'écrit comme en jQuery. - Extraction de données : méthodes
Text(),Html(),Attr(). - Modification du DOM :
SetText(),SetHtml(),Append().
Pour travailler avec de grands volumes de données, goquer
Aussi dans la bibliothèque
Travailler avec les archives ZIP dans Node.js : guide complet
Travailler avec les dates en Swift : Foundation, SwiftDate, DateTools (iOS/macOS)
Journalisation pour TypeScript : la bibliothèque Winston
Travailler avec Excel en Rust : bibliothèques et exemples de code