Alternativas a Beautiful Soup para Go

Continuando el tema de extracción de datos de HTML

Índice
  • Para un análogo directo de Beautiful Soup en Go, usa soup.
  • Para soporte de selectores CSS, considera goquery.
  • Para consultas XPath, usa htmlquery.
  • Para otra opción inspirada en Beautiful Soup, mira Node.

Si estás buscando un equivalente de Beautiful Soup en Go, varias bibliotecas ofrecen funcionalidades similares de análisis y raspado de HTML:

gopher is cooking soup

soup

  • soup es una biblioteca de Go diseñada específicamente como un análogo de Beautiful Soup en Python. Su API es intencionalmente similar, con funciones como Find, FindAll y HTMLParse, lo que facilita la transición para desarrolladores familiarizados con Beautiful Soup.
  • Permite obtener páginas web, analizar HTML y recorrer el DOM para extraer datos, de manera similar a Beautiful Soup.
  • Ejemplo 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 no admite selectores CSS ni XPath; depende de la búsqueda basada en etiquetas y atributos.

goquery

  • goquery es otra biblioteca popular de Go para el análisis de HTML, ofreciendo una sintaxis similar a jQuery para el recorrido y manipulación del DOM.
  • Admite selectores CSS, lo que lo hace más flexible para consultas complejas en comparación con soup.
  • Ejemplo 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", ""))
    })
    

htmlquery (Biblioteca Go)

htmlquery es una biblioteca de Go diseñada para analizar y extraer datos de documentos HTML utilizando expresiones XPath. Proporciona una API sencilla para recorrer y consultar la estructura del árbol HTML, lo que la hace especialmente útil para tareas de raspado web y extracción de datos.

Funciones clave

  • Permite consultar documentos HTML con expresiones XPath 1.0/2.0.
  • Soporta la carga de HTML desde cadenas, archivos o URLs.
  • Ofrece funciones para encontrar nodos individuales o múltiples, extraer atributos y evaluar expresiones XPath.
  • Incluye caché de consultas (basado en LRU) para mejorar el rendimiento evitando la compilación repetida de expresiones XPath.
  • Está construida sobre las bibliotecas estándar de análisis de HTML de Go y es compatible con otras bibliotecas de Go como goquery.

Ejemplos de uso básico

Cargar HTML desde una cadena:

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

Cargar HTML desde una URL:

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

Encontrar todos los elementos ``:

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

Encontrar todos los elementos `` con un atributo href:

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

Extraer el texto del primer elemento ``:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // Muestra el texto dentro 

Extraer todos los valores del atributo href de los elementos ``:

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

Casos de uso típicos

  • Raspado web donde XPath proporciona consultas más precisas o complejas que los selectores CSS.
  • Extracción de datos estructurados de documentos HTML.
  • Navegación y manipulación programática de árboles HTML.

Instalación

go get github.com/antchfx/htmlquery

Node

  • Node es un paquete de Go inspirado en Beautiful Soup, que proporciona APIs para extraer datos de documentos HTML y XML.

Colly

Colly - Un marco de raspado web para Go, que utiliza goquery internamente para el análisis de HTML.

https://github.com/gocolly/colly

Para instalar - agrega colly a tu archivo go.mod:

module github.com/x/y

go 1.14

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

Ejemplo:

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

	// Encontrar y visitar todos los enlaces
	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/")
}

Tabla de comparación

Biblioteca Estilo de API Soporte de selectores Inspiración Notas
soup Similar a Beautiful Soup Solo etiqueta y atributo Beautiful Soup Simple, sin CSS/XPath
goquery Similar a jQuery Selectores CSS jQuery Flexible, popular
htmlquery XPath XPath lxml/XPath Consultas avanzadas
Node Similar a Beautiful Soup Solo etiqueta y atributo Beautiful Soup Similar a soup

Resumen

  • Para un análogo directo de Beautiful Soup en Go, usa soup.
  • Para soporte de selectores CSS, considera goquery.
  • Para consultas XPath, usa htmlquery.
  • Para otra opción inspirada en Beautiful Soup, mira Node.

Todas estas bibliotecas aprovechan el análisis de HTML estándar de Go, que es robusto y compatible con HTML5, por lo que la principal diferencia radica en el estilo de API y las capacidades de selección.

Enlaces útiles