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/reservedEste 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.