#やりたいこと
http://recipe.rakuten.co.jp/recipe/1150010609/
このサイトのレシピデータをgo言語でスクレイピングし、その後JSONで返すapIを作りたです
#JSON
json
1{ 2name:"料理名", 3image:"料理写真", 4explanation:"料理の説明" 5material: { name:["各材料の名前をもつstringの配列"], 6 quantity:["各材料の分量をstringの配列]}, 7process:[{image:"料理工程の写真(ここわからない)", 8 quantity:"作業内容"},.....] 9}
#現在のコード
go
1package main 2 3import ( 4 "encoding/json" 5 "io/ioutil" 6 "os" 7 8 "github.com/PuerkitoBio/goquery" 9) 10 11type process struct { 12 Image string `json:"image"` 13 Operation string `json:"operation"` 14} 15 16type material struct { 17 Name []string `json:"name"` 18 Quantity []string `json:"quantity"` 19} 20 21//メインのjson 22type mesi struct { 23 Name string `json:"name"` 24 Image string `json:"image"` 25 MemberNum string `json:"membernum"` 26 Explanation string `json:"n"` 27 Material material `json:"material"` 28 Process []process `json:"process"` 29} 30 31//料理名(タイトル)を返す。 32func title(url string) string { 33 var i string 34 doc, _ := goquery.NewDocument(url) 35 doc.Find("h1").Each(func(_ int, s *goquery.Selection) { 36 i = s.Text() 37 }) 38 return i 39} 40 41//何人前かを返す関数 42func people(url string) string { 43 var i string 44 doc, _ := goquery.NewDocument(url) 45 doc.Find("div > div > div > div > div > h3 > span > span").Each(func(_ int, s *goquery.Selection) { 46 i = s.Text() 47 }) 48 return i 49} 50 51//材料の量をstringの配列で返す 52func materialQuantity(url string) []string { 53 var quantity []string 54 doc, _ := goquery.NewDocument(url) 55 doc.Find("div > div > div > div > ul > li > p.amount").Each(func(_ int, s *goquery.Selection) { 56 quantity = append(quantity, s.Text()) 57 }) 58 return quantity 59} 60 61//手順をstringの配列で返す 62func procedure(url string) []string { 63 var procedure []string 64 doc, _ := goquery.NewDocument(url) 65 doc.Find("li#step_box_li.stepBox > p.stepMemo").Each(func(_ int, s *goquery.Selection) { 66 procedure = append(procedure, s.Text()) 67 }) 68 return procedure 69} 70 71//完成時の写真のurlをstringで返す。 72func image(url string) string { 73 var imgURL string 74 doc, _ := goquery.NewDocument(url) 75 doc.Find("div > div > span > img").Each(func(_ int, s *goquery.Selection) { 76 url, _ := s.Attr("src") 77 // fmt.Println(url) 78 imgURL = url 79 }) 80 return imgURL 81} 82 83//調理時のコツについてをstringで返す。 84func kotu(url string) string { 85 var kotu string 86 doc, _ := goquery.NewDocument(url) 87 doc.Find("div.howtoPointBox.last > p").Each(func(_ int, s *goquery.Selection) { 88 kotu = s.Text() 89 }) 90 return kotu 91} 92 93//材料の名前をstringの配列で返す 94func mat(url string) []string { 95 var materials []string 96 doc, _ := goquery.NewDocument(url) 97 doc.Find("div > div > div > div > ul > li > a#material_link.name").Each(func(_ int, s *goquery.Selection) { 98 materials = append(materials, s.Text()) 99 }) 100 return materials 101} 102 103//説明文を返す。 104func exp(url string) string { 105 var i string 106 doc, _ := goquery.NewDocument(url) 107 doc.Find(" div >div > div > div > p.summary").Each(func(_ int, s *goquery.Selection) { 108 i = s.Text() 109 }) 110 return i 111} 112 113//各pointを1.もう一度作りたい 2.簡単だった 3.節約できた 114// func point(url string) []int64 { 115// var points []string 116// doc, _ := goquery.NewDocument(url) 117// doc.Find("dl > dd > div > p.num ").Each(func(_ int, s *goquery.Selection) { 118// points = append(points, s.Text()) 119// }) 120// return points 121// } 122 123func main() { 124 var recipe mesi 125 var mat material 126 var proc [30]process 127 s := 0 128 url := "http://recipe.rakuten.co.jp/recipe/1150010609/" 129 130 recipe.Name = title(url) 131 recipe.Image = image(url) 132 recipe.MemberNum = people(url) 133 resipe.Explanation = exp(url) 134 135 mat.Quantity = materialQuantity(url) 136 mat.Name = mat(url) 137 resipe.Material = mat 138 for i := range procedure(url) { 139 proc[s].Operation = append(proc.Operation, i) 140 s++ 141 } 142 recipe.Process = proc 143 bytes, _ := json.Marshal(recipe) 144 ioutil.WriteFile("./test.json", bytes, os.ModePerm) 145}
#エラー
# command-line-arguments ./getCooking.go:133: undefined: resipe in resipe.Explanation ./getCooking.go:133: cannot assign to resipe.Explanation ./getCooking.go:136: cannot call non-function mat (type material) ./getCooking.go:137: undefined: resipe in resipe.Material ./getCooking.go:137: cannot assign to resipe.Material ./getCooking.go:139: proc.Operation undefined (type [30]process has no field or method Operation) ./getCooking.go:142: cannot use proc (type [30]process) as type []process in assignment
#知りたいこと
- エラーの解消方法を教えていただきたい
- 作り方の途中で出てくる写真がない時があって、その場合どうやってそこをスキップして、作業工程の番号と同じjsonの配列の中に入れられるのかを教えていただきたい

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/24 04:14
2016/08/24 04:15
2016/08/24 04:15
2016/08/24 04:24
2016/08/24 04:30
2016/08/24 04:40
2016/08/24 04:52
2016/08/24 04:57
2016/08/24 05:26
2016/08/24 05:38
2016/08/24 06:16
2016/08/24 06:38