//go:build ignore // +build ignore package main import ( "encoding/csv" "flag" "fmt" "net/http" "os" // "strconv" "strings" "github.com/PuerkitoBio/goquery" ) func main() { season := flag.Int("season", 0, "NBA season year (e.g. 2024)") outPath := flag.String("out", "", "output CSV file path (default: stdout)") flag.Parse() if *season == 0 { fmt.Fprintln(os.Stderr, "ā must provide -season, e.g. -season=2024") os.Exit(1) } url := fmt.Sprintf("https://www.basketball-reference.com/leagues/NBA_%d_advanced.html", *season) fmt.Println("Fetching:", url) resp, err := http.Get(url) if err != nil { fmt.Fprintln(os.Stderr, "HTTP error:", err) os.Exit(1) } defer resp.Body.Close() doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { fmt.Fprintln(os.Stderr, "Parse error:", err) os.Exit(1) } // --- Extract headers --- var headers []string doc.Find("#div_advanced table#advanced thead tr th").EachWithBreak(func(i int, s *goquery.Selection) bool { // grab first 29 columns, then we'll append our own PlayerID text := strings.TrimSpace(s.Text()) if i < 29 { headers = append(headers, text) return true } return false }) headers = append(headers, "Player-additional") // --- Extract data rows --- var rows [][]string doc.Find("#div_advanced table#advanced tbody tr").Each(func(_ int, row *goquery.Selection) { if row.HasClass("thead") { // skip repeated headers return } // rank in