Parseo de HTML en Go (Golang): revisión de bibliotecas y ejemplos prácticos
Go (Golang) es un lenguaje compilado y de tipado estático que es ideal para crear herramientas de alto rendimiento para web scraping y parseo de HTML. La biblioteca estándar incorporada net/html proporciona un tokenizador de bajo nivel, sin embargo, para trabajar cómodamente con el árbol DOM y los selectores CSS, se suelen usar paquetes de terceros. En este artículo, analizaremos tres herramientas clave: goquery, colly y el paquete estándar net/html. Aprenderás cómo elegir la herramienta adecuada y verás ejemplos de código funcionales.
1. Biblioteca estándar: net/html
El paquete golang.org/x/net/html proporciona un tokenizador y un analizador de HTML. Implementa la especificación HTML5 y permite descomponer un documento en un árbol de nodos. Es la opción más ligera y rápida, pero requiere escribir más código para la navegación.
Ejemplo: extraer todos los enlaces (<a href>) de una página:
package main
import ( "fmt" "golang.org/x/net/html" "net/http" "strings")
func main() { resp, _ := http.Get("https://example.com") defer resp.Body.Close()
doc, _ := html.Parse(resp.Body)
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)
fmt.Println(strings.Join(links, ""))}Ventajas: dependencias mínimas, alta velocidad.
Desventajas: no tiene selectores CSS, hay que escribir recorridos recursivos.
2. goquery — jQuery para Go
goquery es la biblioteca más popular para el parseo de HTML en Go. Utiliza net/html internamente y añade una sintaxis similar a jQuery. Puedes usar selectores CSS para buscar elementos, encadenar llamadas y manipular el DOM.
Instalación:
go get github.com/PuerkitoBio/goqueryEjemplo: recopilar títulos de artículos de un blog:
package main
import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")
func main() { resp, err := http.Get("https://habr.com/ru/all/") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }
doc.Find("article h2").Each(func(i int, s *goquery.Selection) { title := s.Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s %s", i+1, title, link) })}Métodos principales de goquery:
Find(selector)— búsqueda de elementos por selector CSSEach(func)— iteración sobre los elementos encontradosAttr(name)— obtención del valor de un atributoText()— extracción del contenido textualHtml()— obtención del código HTML dentro del elemento
goquery es ideal para prototipado rápido y para el parseo de páginas con estructura compleja. Sin embargo, recuerda: no admite la ejecución de JavaScript — es una herramienta para HTML estático.
3. Colly — framework para web scraping
Colly es un potente framework que incluye no solo el parseo de HTML (a través de goquery), sino también la gestión de colas de solicitudes, el trabajo con cookies, límites de
También en la biblioteca
cereal para C++: guía completa con ejemplos
Integración de métricas Prometheus en aplicaciones C++: biblioteca prometheus-cpp
WireMock.Net para C# (.NET): guía completa con ejemplos
Cliente OAuth para Swift (iOS/macOS): biblioteca OAuthSwift