Parsing de HTML em Go (Golang): ferramentas e exemplos práticos
Go (Golang) é uma linguagem compilada, estaticamente tipada, criada no Google. Graças à alta performance, suporte nativo a concorrência e rica biblioteca padrão, Go se tornou uma das melhores linguagens para web scraping e parsing de HTML. Neste artigo, abordaremos as principais bibliotecas para trabalhar com documentos HTML em Go, forneceremos exemplos de código e compararemos suas funcionalidades.
Por que fazer parsing de HTML em Go?
O parsing de HTML é necessário para extrair dados de páginas web: notícias, preços, informações de contato, resultados de pesquisa. Go é excelente para essa tarefa devido a:
- Alta velocidade de execução (compila para código de máquina)
- Facilidade de trabalho com rede (pacote nativo
net/http) - Simplicidade na análise da árvore DOM através de bibliotecas especializadas
- Excelente suporte a multithreading (goroutines e canais)
Principais bibliotecas para parsing de HTML em Go
1. net/html — biblioteca padrão
golang.org/x/net/html é um tokenizador e parser de HTML de baixo nível da biblioteca padrão do Go. Ele oferece controle total sobre o processo de parsing, mas requer mais código para ser escrito.
Exemplo: extrair todos os links (<a href>) de um documento 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)}Prós: não requer instalação de pacotes de terceiros, controle total. Contras: muito código boilerplate, inconveniente para seletores complexos.
2. goquery — sintaxe semelhante ao jQuery
github.com/PuerkitoBio/goquery é a biblioteca mais popular para parsing de HTML em Go. Ela fornece uma API semelhante ao jQuery: Find(), Each(), Attr(), Text().
Exemplo: parsing de títulos de notícias de um 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 Link: %s", i+1, title, link) })}Prós: sintaxe simples, suporte a seletores CSS, documentação rica. Contras: não é adequado para documentos muito grandes (carrega tudo na memória).
3. colly — framework para web scraping
github.com/gocolly/colly é um poderoso framework para coleta de dados. Ele inclui parsing de HTML (baseado em goquery), gerenciamento de fila de requisições, manipulação de cookies, limites de velocidade e muito mais.
Exemplo: coleta de todos os links da primeira página de um site com atraso entre requisições.
package main
import ( "fmt" "github.com/gocolly/colly/v2")
func main() { c := colly.NewC Também na biblioteca
Tokens JWT em Swift: guia completo para trabalhar com JSON Web Tokens
Registro em JavaScript (Node.js): melhores soluções para o seu projeto
Faker para PHP: guia completo com exemplos
Validação de dados em C# (.NET): bibliotecas, atributos e FluentValidation