package main import ( "encoding/json" "fmt" "io/ioutil" "os" "github.com/PuerkitoBio/goquery" ) type ( // Meal contains the info about a meals Meal struct { Category string `json:"category"` Price string `json:"price"` Title string `json:"title"` } // Menu contains all info to menues in a mensa on one day Menu struct { Day string `json:"day"` Mensa string `json:"mensa"` Meals []Meal `json:"meals"` } ) var ( mensen = []string{ "Zentralmensa", "Nordmensa", } days = []string{ "heute", "morgen", "uebermorgen", } ) func main() { menus := []Menu{} for _, mensa := range mensen { for _, day := range days { menu, err := operate(mensa, day) if err != nil { fmt.Println(err.Error()) } menus = append(menus, menu) } } bytes, err := json.Marshal(menus) if err != nil { fmt.Println(err.Error()) } if len(os.Args) == 2 { err = writeToFile(bytes) if err != nil { fmt.Println(err.Error()) } } else { fmt.Println(string(bytes)) } } func writeToFile(content []byte) error { err := ioutil.WriteFile(os.Args[1], content, 0644) if err != nil { return err } return nil } func operate(mensa, day string) (Menu, error) { meals, err := parseHTML(fmt.Sprintf("https://phpapp2.zvw.uni-goettingen.de/portlet_mensaplan/public/ajaxresponse/getgerichte?mensa=%s&tag=%s&preis=stu&vegetarisch=true&schweinefleisch=true&vegan=true&fisch=true&gefluegel=true&rind=true&wild=true&lamm=true&alkohol=true&knoblauch=true&sonstige_gerichte=true", mensa, day)) if err != nil { return Menu{}, err } return Menu{Day: day, Mensa: mensa, Meals: meals}, nil } func parseHTML(url string) ([]Meal, error) { doc, err := goquery.NewDocument(url) if err != nil { return nil, err } meals := []Meal{} doc.Find("table tr").Each(func(i int, s *goquery.Selection) { meal := Meal{ Category: s.Find(".gericht_kategorie").Text(), Price: s.Find(".gericht_preis").Text(), Title: s.Find(".spalte_gericht").Text(), } meals = append(meals, meal) }) return meals, nil }