Parseo de HTML en Go (Golang): descripción general de herramientas y ejemplos
Go (Golang) es un lenguaje de programación compilado y tipado estáticamente de Google, ideal para crear parsers y web scrapers de alto rendimiento. Gracias al soporte integrado de concurrencia (gorutinas) y una rica biblioteca estándar, Go permite procesar documentos HTML de cualquier complejidad de manera eficiente. En este artículo, analizaremos las principales bibliotecas para el parseo de HTML en Go, sus capacidades y proporcionaremos ejemplos prácticos de código.
Biblioteca estándar: net/html
El paquete golang.org/x/net/html es la base para trabajar con HTML en Go. Proporciona un tokenizador y un parser que construye el árbol DOM del documento. Es una herramienta de bajo nivel que brinda control total sobre el proceso de análisis, pero requiere más código para tareas típicas.
Ejemplo de uso de net/html para extraer todos los enlaces de un documento HTML:
package main
import ( "fmt" "golang.org/x/net/html" "strings")
func main() { htmlContent := `<html><body><a href="/page1">Enlace 1</a><a href="/page2">Enlace 2</a></body></html>` doc, _ := html.Parse(strings.NewReader(htmlContent)) 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) for _, link := range links { fmt.Println(link) }}Este código recorre recursivamente el árbol DOM, encuentra todas las etiquetas <a> y extrae el valor del atributo href. El método es simple y confiable, pero para tareas más complejas (por ejemplo, búsqueda por selectores CSS), es mejor usar bibliotecas especializadas.
Biblioteca goquery: jQuery para Go
github.com/PuerkitoBio/goquery es la biblioteca más popular para el parseo de HTML en Go. Proporciona una API similar a jQuery: selección de elementos por selectores CSS, encadenamiento de métodos, manipulación del DOM. Esto hace que el código sea conciso y legible.
Instalación:
go get github.com/PuerkitoBio/goqueryEjemplo de parseo de una página extrayendo encabezados y enlaces:
package main
import ( "fmt" "log" "net/http"
"github.com/PuerkitoBio/goquery")
func main() { // Cargamos la página HTML res, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer res.Body.Close()
// Parseamos el HTML doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) }
// Extraemos los encabezados h2 doc.Find("h2").Each(func(i int, s *goquery.Selection) { fmt.Printf("Encabezado %d: %s", i+1, s.Text()) })
// Extraemos todos los enlaces doc.Find("a").Each(func(i int, s *goquery.Selection) { link, _ := s.Attr("href") text := s.Text() fmt.Printf("Enlace %d: %s (%s)", i+1, text, link) })}Características clave de goquery:
- Selectores CSS: soporte para todos los selectores estándar (clases, ID, atributos, pseudoclases).
- Encadenamiento de métodos:
Find().Filter().Each()— el código se escribe como en jQuery. - Extracción de datos: métodos
Text(),Html(),Attr(). - Modificación del DOM:
SetText(),SetHtml(),Append().
Para trabajar con grandes volúmenes de datos, goquer