Alternativas ao Beautiful Soup para Go

Continuando o tema de extração de dados de HTML

Conteúdo da página
  • Para um análogo direto 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ê está procurando um equivalente do Beautiful Soup em Go, várias bibliotecas oferecem funcionalidades semelhantes para análise e raspagem de HTML:

gopher is cooking soup

soup

  • soup é uma biblioteca Go explicitamente projetada como um análogo ao Beautiful Soup do Python. Sua API é intencionalmente semelhante, com funções como Find, FindAll e HTMLParse, tornando fácil para desenvolvedores familiarizados com o Beautiful Soup migrar para o Go.
  • Ele permite que você obtenha páginas da web, analise HTML e percorra o DOM para extrair dados, muito como 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"])
    }
    
  • Observação: soup não suporta seletores CSS ou XPath; ele depende de buscas baseadas em tags e atributos.

goquery

  • goquery é outra biblioteca popular do Go para análise de HTML, oferecendo uma sintaxe semelhante à do jQuery para navegação e manipulação do DOM.
  • Ele suporta seletores CSS, tornando-o mais flexível para consultas complexas em comparação com 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 do Go

htmlquery é uma biblioteca do Go projetada para analisar e extrair dados de documentos HTML usando expressões XPath. Ela fornece uma API direta para navegar e consultar a estrutura da árvore HTML, tornando-a especialmente útil para raspagem de web e extração de dados.

Funcionalidades Principais

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

Exemplos de Uso Básicos

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)) // Imprime o texto dentro 

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 de web onde XPath oferece consultas mais precisas ou complexas do que seletores CSS.
  • Extração de dados estruturados de documentos HTML.
  • Navegação e manipulação programática de árvores HTML.

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 goquery internamente para análise 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()

	// Encontrar e visitar 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("Visiting", r.URL)
	})

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

Tabela de Comparação

Biblioteca Estilo da API Suporte a Seletores Inspiração Notas
soup Semelhante ao Beautiful Soup Apenas tag e atributo Beautiful Soup Simples, sem CSS/XPath
goquery Semelhante ao jQuery Seletores CSS jQuery Flexível, popular
htmlquery XPath XPath lxml/XPath Consultas avançadas
Node Semelhante ao Beautiful Soup Apenas tag e atributo Beautiful Soup Similar ao soup

Resumo

  • Para um análogo direto 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 utilizam o Go’s parser de HTML padrão, que é robusto e compatível com HTML5, então a principal diferença está no estilo da API e nas capacidades de seletores.