Alternativas de Beautiful Soup para Go

Continuando con el tema de la extracción de datos de HTML

Índice
  • Para un análogo directo de Beautiful Soup en Go, utiliza soup.
  • Para soporte de selectores CSS, considera goquery.
  • Para consultas XPath, utiliza 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 extracción de HTML:

gopher cocinando sopa

soup

  • soup es una biblioteca de Go diseñada explícitamente como un análogo de Beautiful Soup de Python. Su API es intencionalmente similar, e incluye funciones como Find, FindAll y HTMLParse, lo que facilita la transición a Go para los desarrolladores familiarizados con Beautiful Soup.
  • Permite obtener páginas web, analizar HTML y recorrer el DOM para extraer datos, de manera muy 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(), "| Enlace :", link.Attrs()["href"])
    }
    
  • Nota: soup no admite selectores CSS ni XPath; se basa en búsquedas por etiqueta y atributo.

goquery

  • goquery es otra biblioteca de Go popular para el análisis de HTML, que ofrece una sintaxis similar a jQuery para la navegación 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(), "| Enlace :", s.AttrOr("href", ""))
    })
    

Biblioteca Go htmlquery

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.

Características principales

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

Ejemplos básicos de uso

Cargar HTML desde una cadena de caracteres:

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

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 de árboles HTML de forma programática.

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, añade 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("Visitando", r.URL)
	})

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

Tabla comparativa

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 Etiqueta y atributo Beautiful Soup Similar a soup

Resumen

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

Todas estas bibliotecas aprovechan el analizador HTML estándar de Go, que es robusto y compatible con HTML5, por lo que la principal diferencia radica en el estilo de la API y en las capacidades de los selectores.

Enlaces útiles

Suscribirse

Recibe nuevas publicaciones sobre sistemas, infraestructura e ingeniería de IA.