|
|
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 }
|