迭代* goquery.Selection

时间:2015-01-05 09:09:16

标签: go

我刚刚开始学习Go,所以请耐心等待。 :)

我正在使用goquery从网页中提取文字。像这样:

package main

import (
    "fmt"
    "log"
    "github.com/PuerkitoBio/goquery"
)

func ExampleScrape() {
    doc, err := goquery.NewDocument("http://lifehacker.com")
    if err != nil {
        log.Fatal(err)
        fmt.Println("fail")
    } else {
        fmt.Println("got it")
    }

    h1_text := doc.Find("h1").Text()
    fmt.Println(h1_text)
}

func main() {
    ExampleScrape()
}

这很有效。我无法弄清楚的是如何将doc.Find("h1").Text()选择转换为数组或切片,以便我可以迭代它们(或者更好的是,确定goquery是否具有此函数) 。我确定有办法做到这一点,对吗?

我尝试过这样做(在func ExampleScrape内):

var x []string
doc.Find("h1").Each(func(i int, s *goquery.Selection) {
    append(x, s.Text())
})

但它没有用,因为'嵌套'/ closure函数中的append仍然是该函数的本地函数 - 它不会返回func ExampleScrape。所以我试过这个:

x := doc.Find("h1").Each(func(i int, s *goquery.Selection) {
    return s.Text()
})
for _, i := range x {
    fmt.Println(x)
}

*goquery.Selection类型不能超出范围。

有没有办法像这样迭代*goquery.Selection

顺便说一句,你们这里的人都很棒。我总是对我在这里得到的答案感到震惊。如果有人可以解释如何做到这一点,请提前感谢googolplex。 :)

1 个答案:

答案 0 :(得分:2)

如果您正确使用append,我认为您的首次尝试可行。 append(x, s.Text())不会更改x,而是返回一个新切片。

所以你真的需要这样做:

x = append(x, s.Text())