Alternativas ao Beautiful Soup para Go

Continuando o tópico de extração de dados de HTML.

Conteúdo da página
  • Para uma analogia direta do Beautiful Soup em Go, use soup.
  • Para suporte a seletores CSS, considere goquery.
  • Para consultas XPath, use htmlquery.
  • Para outra opção inspirada no Beautiful Soup, veja Node.

Se você procura por um equivalente do Beautiful Soup em Go, várias bibliotecas oferecem funcionalidades semelhantes de parsing e raspagem de HTML:

gopher está cozinhando sopa

soup

  • soup é uma biblioteca Go explicitamente projetada como uma analogia ao Beautiful Soup do Python. Sua API é intencionalmente similar, apresentando funções como Find, FindAll e HTMLParse, facilitando a transição para desenvolvedores familiarizados com o Beautiful Soup.
  • Permite buscar páginas web, analisar HTML e percorrer o DOM para extrair dados, muito parecido com o Beautiful Soup.
  • Exemplo de uso:
    resp, err := soup.Get("https://xkcd.com")
    if err != nil {
        os.Exit(1)
    }
    doc := soup.HTMLParse(resp)
    links := doc.Find("div", "id", "comicLinks").FindAll("a")
    for _, link := range links {
        fmt.Println(link.Text(), "| Link :", link.Attrs()["href"])
    }
    
  • Nota: soup não suporta seletores CSS nem XPath; depende de buscas baseadas em tags e atributos.

goquery

  • goquery é outra biblioteca Go popular para parsing de HTML, oferecendo uma sintaxe semelhante ao jQuery para travessia e manipulação do DOM.
  • Suporta seletores CSS, tornando-o mais flexível para consultas complexas em comparação com o soup.
  • Exemplo de uso:
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#comicLinks a").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text(), "| Link :", s.AttrOr("href", ""))
    })
    

Biblioteca htmlquery Go

htmlquery é uma biblioteca Go projetada para analisar e extrair dados de documentos HTML usando expressões XPath. Oferece uma API direta para percorrer e consultar a estrutura da árvore HTML, tornando-a especialmente útil para tarefas de raspagem de dados web.

Principais recursos

  • Permite consultar documentos HTML com expressões XPath 1.0/2.0.
  • Suporta carregamento de HTML de strings, arquivos ou URLs.
  • Oferece funções para encontrar nós únicos ou múltiplos, extrair atributos e avaliar expressões XPath.
  • Inclui cache de consultas (baseado em LRU) para melhorar o desempenho, evitando a compilação repetida de expressões XPath.
  • Construída sobre as bibliotecas padrão de parsing HTML do Go e compatível com outras bibliotecas Go como goquery.

Exemplos de uso básico

Carregar HTML de uma string:

doc, err := htmlquery.Parse(strings.NewReader("..."))

Carregar HTML de uma URL:

doc, err := htmlquery.LoadURL("http://example.com/")

Encontrar todos os elementos ``:

list := htmlquery.Find(doc, "//a")

Encontrar todos os elementos `` com um atributo href:

list := htmlquery.Find(doc, "//a[@href]")

Extrair o texto do primeiro elemento ``:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // Exibe o texto dentro do 

Extrair todos os valores do atributo href dos elementos ``:

list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
    fmt.Println(htmlquery.SelectAttr(n, "href"))
}

Casos de uso típicos

  • Raspagem web onde o XPath oferece consultas mais precisas ou complexas do que seletores CSS.
  • Extração de dados estruturados de documentos HTML.
  • Navegação e manipulação de árvores HTML de forma programática.

Instalação

go get github.com/antchfx/htmlquery

Node

  • Node é um pacote Go inspirado no Beautiful Soup, fornecendo APIs para extrair dados de documentos HTML e XML.

Colly

Colly - Um framework de raspagem web para Go, que usa o goquery internamente para parsing de HTML.

https://github.com/gocolly/colly

Para instalar - adicione colly ao seu arquivo go.mod:

module github.com/x/y

go 1.14

require (
        github.com/gocolly/colly/v2 latest
)

Exemplo:

func main() {
	c := colly.NewCollector()

	// Encontre e visite todos os links
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Visitando", r.URL)
	})

	c.Visit("http://go-colly.org/")
}

Tabela de comparação

Biblioteca Estilo da API Suporte a seletores Inspiração Observações
soup Similar ao Beautiful Soup Apenas tags e atributos Beautiful Soup Simples, sem CSS/XPath
goquery Similar ao jQuery Seletores CSS jQuery Flexível, popular
htmlquery XPath XPath lxml/XPath Consultas avançadas
Node Similar ao Beautiful Soup Tags e atributos Beautiful Soup Similar ao soup

Resumo

  • Para uma analogia direta do Beautiful Soup em Go, use soup.
  • Para suporte a seletores CSS, considere goquery.
  • Para consultas XPath, use htmlquery.
  • Para outra opção inspirada no Beautiful Soup, veja Node.

Todas essas bibliotecas aproveitam o analisador HTML padrão do Go, que é robusto e compatível com HTML5, então a principal diferença está no estilo da API e nas capacidades de seleção.