Parsing HTML en Go (Golang) : bibliothèques et exemples de code

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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

Recommendations