Go: parsing di una sitemap di Google

Go: parsing di una sitemap di Google

In questo articolo vedremo come effettuare il parsing di una sitemap di Google con Go.

Una sitemap di Google è un documento XML il cui elemento radice è l'elemento urlset. All'interno di questo elemento sono contenuti gli elementi url. Ciascuno di questi elementi contiene le informazioni relative agli URL presenti in un sito web, racchiuse nei seguenti elementi discendenti:

  • loc: l'URL della pagina web
  • lastmod: la data dell'ultima modifica
  • changefreq: l'intervallo in cui viene effettuata una modifica
  • priority: un numero che rappresenta la priorità da assegnare all'URL.

Come per JSON, in Go occorre creare delle struct che rappresentano la struttura del documento XML. Per questo scopo si utilizza il package encoding/xml che userà le seguenti struct:

package main

import "encoding/xml"

type Sitemap struct {
    XMLName xml.Name     `xml:"urlset"`
    Xmlns   string       `xml:"xmlns,attr"`
    URLs    []SitemapURL `xml:"url"`
}

type SitemapURL struct {
    XMLName    xml.Name `xml:"url"`
    Loc        string   `xml:"loc"`
    Lastmod    string   `xml:"lastmod"`
    Changefreq string   `xml:"changefreq"`
    Priority   string   `xml:"priority"`
}

Un elemento genitore viene contrassegnato con il tipo xml.Name. Come per JSON, anche in questo caso è necessario usare i tag per far corrispondere al campo della struct l'elemento del documento XML. Ad esempio il tag xml:"loc" fa corrispondere il campo Loc all'elemento XML <loc> presente nel documento.

Vogliamo reperire quindi una sitemap tramite una richiesta HTTP GET ed effettuarne il parsing. Possiamo scrivere il seguente codice:

package main

import (
    "encoding/xml"
    "fmt"
    "net/http"
    "log"
    "io"
)

type Sitemap struct {
    XMLName xml.Name     `xml:"urlset"`
    Xmlns   string       `xml:"xmlns,attr"`
    URLs    []SitemapURL `xml:"url"`
}

type SitemapURL struct {
    XMLName    xml.Name `xml:"url"`
    Loc        string   `xml:"loc"`
    Lastmod    string   `xml:"lastmod"`
    Changefreq string   `xml:"changefreq"`
    Priority   string   `xml:"priority"`
}


func main() {
    sitemapURL := "https://site.tld/sitemap.xml"
    res, err := http.Get(url)
    
    if err != nil {
            log.Fatal(err)
        }
        
        body, err := io.ReadAll(res.Body)
        defer res.Body.Close()
        
        if res.StatusCode > 299 {
            log.Fatal(res.StatusCode)
        }
        
        if err != nil {
            log.Fatal(err)
        }
        
        var s Sitemap
        xml.Unmarshal(body, &s)
        
        for _, url := range s.URLs {
            fmt.Println(url.Loc)
        }
}

xml.Unmarshal accetta come input i byte del documento XML reperito tramite la richiesta GET ed utilizza le struct che abbiamo definito prima per popolare l'elenco di elementi SitemapURL contenuti nella struct principale Sitemap.

In conclusione, il parsing di una sitemap di Google con Go si rivela essere relativamente semplice e ci permette di progettare ad esempio applicazioni dalla riga di comando che sfruttino questa caratteristica.

Torna su