Análise de HTML em Go (Golang): visão geral das ferramentas e exemplos
Go (Golang) é uma linguagem de programação compilada, estaticamente tipada do Google, ideal para criar parsers e web scrapers de alto desempenho. Graças ao suporte embutido para concorrência (goroutines) e à rica biblioteca padrão, Go permite processar documentos HTML de qualquer complexidade de forma eficiente. Neste artigo, veremos as principais bibliotecas para análise de HTML em Go, seus recursos e exemplos práticos de código.
Biblioteca padrão: net/html
O pacote golang.org/x/net/html é a base para trabalhar com HTML em Go. Ele fornece um tokenizador e um parser que constrói a árvore DOM do documento. Esta é uma ferramenta de baixo nível que oferece controle total sobre o processo de análise, mas requer mais código para tarefas comuns.
Exemplo de uso do net/html para extrair todos os links de um documento HTML:
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) }}Este código percorre recursivamente a árvore DOM, encontra todas as tags <a> e extrai o valor do atributo href. O método é simples e confiável, mas para tarefas mais complexas (como busca por seletores CSS), é melhor usar bibliotecas especializadas.
Biblioteca goquery: jQuery para Go
github.com/PuerkitoBio/goquery é a biblioteca mais popular para análise de HTML em Go. Ela fornece uma API semelhante ao jQuery: seleção de elementos por seletores CSS, encadeamento de métodos, manipulação do DOM. Isso torna o código conciso e legível.
Instalação:
go get github.com/PuerkitoBio/goqueryExemplo de análise de página com extração de títulos e links:
package main
import ( "fmt" "log" "net/http"
"github.com/PuerkitoBio/goquery")
func main() { // Carregar a página HTML res, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer res.Body.Close()
// Analisar o HTML doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) }
// Extrair títulos h2 doc.Find("h2").Each(func(i int, s *goquery.Selection) { fmt.Printf("Título %d: %s", i+1, s.Text()) })
// Extrair todos os links 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) })}Principais recursos do goquery:
- Seletores CSS: suporte a todos os seletores padrão (classes, ID, atributos, pseudo-classes).
- Encadeamento de métodos:
Find().Filter().Each()— o código é escrito como no jQuery. - Extração de dados: métodos
Text(),Html(),Attr(). - Modificação do DOM:
SetText(),SetHtml(),Append().
Para trabalhar com grandes volumes de dados, goquer
Também na biblioteca
Guia completo do Laravel Passport para PHP: OAuth2 na prática
ExcelJS para JavaScript (Node.js): guia completo com exemplos práticos
Agendador de Tarefas Java: Quartz Scheduler — Guia Completo
Trabalho com imagens em PHP: redimensionamento, corte e otimização com GD e Imagick