Go:
Analisando HTML

Como fazer:

Para analisar HTML em Go, normalmente se usa o pacote goquery ou o pacote net/html da biblioteca padrão. Aqui está um exemplo básico usando net/html para extrair todos os links de uma página da web:

package main

import (
    "fmt"
    "golang.org/x/net/html"
    "net/http"
)

func main() {
    // Obter o documento HTML
    res, err := http.Get("http://example.com")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    // Analisar o documento HTML
    doc, err := html.Parse(res.Body)
    if err != nil {
        panic(err)
    }

    // Função para percorrer recursivamente o DOM
    var f func(*html.Node)
    f = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "a" {
            for _, a := range n.Attr {
                if a.Key == "href" {
                    fmt.Println(a.Val)
                    break
                }
            }
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            f(c)
        }
    }

    // Percorrer o DOM
    f(doc)
}

Saída de exemplo (assumindo que http://example.com contém dois links):

http://www.iana.org/domains/example
http://www.iana.org/domains/reserved

Este código solicita uma página HTML, a analisa e percorre recursivamente o DOM para encontrar e imprimir atributos href de todas as tags <a>.

Aprofundamento

O pacote net/html oferece os fundamentos para analisar HTML em Go, implementando diretamente os algoritmos de tokenização e construção de árvores especificados pelo padrão HTML5. Esta abordagem de baixo nível é poderosa, mas pode ser verbosa para tarefas complexas.

Em contraste, o pacote de terceiros goquery, inspirado pelo jQuery, oferece uma interface de nível mais alto que simplifica a manipulação e o percurso do DOM. Ele permite que os desenvolvedores escrevam códigos concisos e expressivos para tarefas como seleção de elementos, extração de atributos e manipulação de conteúdo.

No entanto, a conveniência do goquery vem com o custo de uma dependência adicional e um desempenho potencialmente mais lento devido à sua camada de abstração. A escolha entre net/html e goquery (ou outras bibliotecas de análise) depende dos requisitos específicos do projeto, como a necessidade de otimização de desempenho ou facilidade de uso.

Historicamente, a análise de HTML em Go evoluiu de operações básicas com strings para sofisticadas manipulações de árvores DOM, refletindo o crescente ecossistema da linguagem e a demanda da comunidade por ferramentas robustas de scraping na web e extração de dados. Apesar das capacidades nativas, a prevalência de bibliotecas de terceiros como goquery destaca a preferência da comunidade Go por códigos modulares e reutilizáveis. No entanto, para aplicações críticas de desempenho, programadores podem ainda favorecer o pacote net/html ou até recorrer a regex para tarefas simples de análise, tendo em mente os riscos inerentes e limitações da análise de HTML baseada em regex.