Go:
HTML:n jäsentäminen

Kuinka:

HTML:n jäsentämiseen Go:ssa käytetään yleensä goquery-pakettia tai standardikirjaston net/html-pakettia. Tässä on perusesimerkki käyttäen net/html-pakettia kaikkien linkkien poimimiseen verkkosivulta:

package main

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

func main() {
    // Hae HTML-dokumentti
    res, err := http.Get("http://esimerkki.com")
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    // Jäsennä HTML-dokumentti
    doc, err := html.Parse(res.Body)
    if err != nil {
        panic(err)
    }

    // Funktio DOMin rekursiiviseen läpikäymiseen
    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)
        }
    }

    // Käy läpi DOM
    f(doc)
}

Esimerkkituloste (olettaen, että http://esimerkki.com sisältää kaksi linkkiä):

http://www.iana.org/domains/esimerkki
http://www.iana.org/domains/varattu

Tämä koodi pyytää HTML-sivua, jäsentää sen ja käy rekursiivisesti läpi DOM-rakenteen löytääkseen ja tulostaakseen kaikkien <a>-tagien href-attribuutit.

Syväsukellus

net/html-paketti tarjoaa perustyökalut HTML:n jäsentämiseen Go:ssa, toteuttaen suoraan HTML5-standardin määrittelemät tokenisointi- ja puurakennusalgoritmit. Tämä matalan tason lähestymistapa on tehokas, mutta voi olla monimutkainen monimutkaisemmissa tehtävissä.

Senaikaisesti kolmannen osapuolen goquery-paketti, jonka on inspiroinut jQuery, tarjoaa korkeamman tason rajapinnan, joka yksinkertaistaa DOM-manipulointia ja -traversointia. Se mahdollistaa kehittäjien kirjoittaa tiiviimpää ja ilmaisuvoimaisempaa koodia tehtäviin, kuten elementin valintaan, attribuuttien poimintaan ja sisällön manipulointiin.

Kuitenkin, goqueryn mukavuus tulee lisäriippuvuuden kustannuksella ja mahdollisesti hitaamman suorituskyvyn vuoksi sen abstraktiotason takia. Valinta net/html ja goquery (tai muiden jäsentämiskirjastojen) välillä riippuu projektin erityisvaatimuksista, kuten suorituskyvyn optimoinnin tarpeesta tai käytön helppoudesta.

Historiallisesti Go:n HTML-jäsentäminen on kehittynyt perus merkkijono-operaatioista edistyneisiin DOM-puurakenteen manipulointitekniikoihin, heijastaen kielen kasvavaa ekosysteemiä ja yhteisön kysyntää vahvoille verkkosivujen kaapimisen ja datan poimintatyökaluille. Huolimatta natiiveista kyvyistä, kolmansien osapuolien kirjastojen, kuten goquery, suosio korostaa Go-yhteisön mieltymystä modulaariseen, uudelleen käytettävään koodiin. Kuitenkin suorituskykyä vaativissa sovelluksissa ohjelmoijat saattavat edelleen suosia net/html-pakettia tai jopa turvautua regexiin yksinkertaisissa jäsentämistehtävissä, pitäen mielessä regex-pohjaisen HTML-jäsentämisen synnynnäiset riskit ja rajoitukset.