Parsing de HTML em Go (Golang): visão geral das bibliotecas e exemplos práticos
Go (Golang) é uma linguagem compilada e estaticamente tipada, excelente para criar ferramentas de alto desempenho para web scraping e parsing de HTML. A biblioteca padrão embutida net/html fornece um tokenizador de baixo nível, no entanto, para trabalhar confortavelmente com a árvore DOM e seletores CSS, pacotes de terceiros são mais usados. Neste artigo, vamos analisar três ferramentas principais: goquery, colly e o pacote padrão net/html. Você aprenderá como escolher a ferramenta adequada e verá exemplos de código funcionais.
1. Biblioteca padrão: net/html
O pacote golang.org/x/net/html fornece um tokenizador e parser HTML. Ele implementa a especificação HTML5 e permite analisar o documento em uma árvore de nós. Esta é a opção mais leve e rápida, mas requer mais código para navegação.
Exemplo: extrair todos os links (<a href>) de uma página:
package main
import ( "fmt" "golang.org/x/net/html" "net/http" "strings")
func main() { resp, _ := http.Get("https://example.com") defer resp.Body.Close()
doc, _ := html.Parse(resp.Body)
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)
fmt.Println(strings.Join(links, ""))}Prós: dependências mínimas, alta velocidade.
Contras: sem seletores CSS, é necessário escrever percorredores recursivos.
2. goquery — jQuery para Go
goquery é a biblioteca mais popular para parsing de HTML em Go. Ela usa net/html internamente e adiciona uma sintaxe semelhante ao jQuery. Você pode usar seletores CSS para encontrar elementos, encadeamento de chamadas e manipulação do DOM.
Instalação:
go get github.com/PuerkitoBio/goqueryExemplo: coletar títulos de artigos de um blog:
package main
import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")
func main() { resp, err := http.Get("https://habr.com/ru/all/") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }
doc.Find("article h2").Each(func(i int, s *goquery.Selection) { title := s.Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s %s", i+1, title, link) })}Principais métodos do goquery:
Find(selector)— busca de elementos por seletor CSSEach(func)— iteração sobre os elementos encontradosAttr(name)— obtenção do valor de um atributoText()— extração do conteúdo textualHtml()— obtenção do código HTML dentro do elemento
goquery é ideal para prototipagem rápida e parsing de páginas com estrutura complexa. No entanto, lembre-se: ele não suporta execução de JavaScript — é uma ferramenta para HTML estático.
3. Colly — framework para web scraping
Colly é um framework poderoso que inclui não apenas parsing de HTML (através do goquery), mas também gerenciamento de fila de requisições, trabalho com cookies, limites