Go:
Analiza składniowa HTML

Jak to zrobić:

Aby przeprowadzić parsowanie HTML w Go, zazwyczaj używa się pakietu goquery lub standardowej biblioteki net/html. Oto podstawowy przykład użycia net/html do wyodrębnienia wszystkich linków z witryny internetowej:

package main

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

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

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

    // Funkcja do rekurencyjnego przechodzenia przez 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)
        }
    }

    // Przechodzenie przez DOM
    f(doc)
}

Przykładowy wynik (zakładając, że http://example.com zawiera dwie linki):

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

Ten kod zażąda strony HTML, przeanalizuje ją i rekurencyjnie przejdzie przez DOM, by znaleźć i wyświetlić atrybuty href wszystkich tagów <a>.

Głębsze spojrzenie

Pakiet net/html dostarcza podstaw do parsowania HTML w Go, bezpośrednio implementując algorytmy tokenizacji i konstrukcji drzewa określone przez standard HTML5. To niskopoziomowe podejście jest potężne, ale może być rozwlekłe dla złożonych zadań.

W przeciwieństwie do tego, pakiet innej firmy goquery, inspirowany przez jQuery, oferuje interfejs wyższego poziomu, który upraszcza manipulację i przechodzenie przez DOM. Pozwala programistom pisać zwięzły i ekspresyjny kod do zadań takich jak wybór elementów, ekstrakcja atrybutów i manipulacja treścią.

Jednak wygoda goquery wiąże się z kosztem dodatkowej zależności i potencjalnie wolniejszą wydajnością z powodu swojej warstwy abstrakcyjnej. Wybór między net/html a goquery (lub innymi bibliotekami parsującymi) zależy od konkretnych wymagań projektu, takich jak potrzeba optymalizacji wydajności czy łatwości użycia.

Historycznie, parsowanie HTML w Go ewoluowało od podstawowych operacji na łańcuchach znaków do zaawansowanej manipulacji drzewem DOM, odzwierciedlając rozwijający się ekosystem języka i zapotrzebowanie społeczności na solidne narzędzia do scrapingu stron internetowych i wydobywania danych. Pomimo możliwości natywnych, powszechność bibliotek firm trzecich jak goquery podkreśla preferencje społeczności Go dla modułowego, wielokrotnie używalnego kodu. Jednak dla aplikacji krytycznych pod względem wydajności, programiści mogą nadal preferować pakiet net/html czy nawet uciekać się do regex dla prostych zadań parsowania, mając na uwadze ryzyko i ograniczenia parsowania HTML za pomocą regex.