package main import ( "bytes" "fmt" "log" "github.com/PuerkitoBio/goquery" ) const src = ` <dl> <dt> <div> <b class="uu">ue</b> <b class="ii">iu</b> </div> </dt> <dd> <a href="aaaaa">ojg</a> </dd> <dt> <div> <b class="ii">tb</b> </div> </dt> <dd> <a href="iiiii">tjk</a> </dd> <dt> <div> <b class="uu">hs</b> <b class="ee">mw</b> </div> </dt> <dd> <a href="uuuuu">wnm</a> </dd> </dl> ` func main() { doc, err := goquery.NewDocumentFromReader(bytes.NewBuffer([]byte(src))) if err != nil { log.Fatal(err) } all_data := [][]string{} doc.Find("dl").Each(func(index int, selection *goquery.Selection) { b_class := selection.Find("dt > div").Nodes a_href := selection.Find("dd > a").Nodes for i := 0; i < len(a_href); i++ { b_class2 := b_class.//???? a_href2 := a_href[i].Attr[0].Val all_data = append(all_data,[]string{b_class2, a_href2}) } }) fmt.Println(all_data) }
[[ue iu,aaaaa],[tb, iiiii],[hs mw, uuuuu]]のようにするにはどうすれば良いのでしょうか?
<div>の中の<b>の数が同じであればできるのですが数が違う場合のやり方がよくわかりません。go1.13
数が違う場合にどうしたいかについてもう少し説明が欲しいです。また単数対応を、複数対応にするというならループを組むのが直感的な方法かと思います。「クエリでどうこうする」のは考えない方が良いと思います。(方法はあるかもしれないけれど、融通は効かないので地道に実装した方が今後応用が効いて良いと思います。類似の質問が繰り返されているので)
すいません
今回は[dt > div > bのテキスト, dd > aのhref属性]にしたいと思っていました
dt > div > bのテキストが複数ある場合は
<b class="uu">ue</b>
<b class="ii">iu</b>
の場合ですとueiuでもue iuでもくっついていてもいなくても大丈夫です
selection.Find("dt > div > b").Text()のようなイメージで考えていました
類似の質問となってしまい大変申し訳ないのですが前回のやり方ではできずNodesのやり方そのものがネット上に中々見つからずわからなかったため質問をさせて頂こうと思ってしまいました。
ループで実現をするやり方を教えていただく事はできませんでしょうか?
回答1件
あなたの回答
tips
プレビュー