golang web刮板,忽略表格的特定单元格

golang web刮板,忽略表格的特定单元格,go,Go,我正在制作一个小的刮网器,来感受一下golang。它目前正在从表中获取wiki的信息,然后专门从单元格中获取信息。我目前身上没有该代码(目前不在家),但它看起来非常类似: func main() { doc, err := goquery.NewDocument("http://monsterhunter.wikia.com/wiki/MH4:_Item_List") if err != nil { log.Fatal(er

我正在制作一个小的刮网器,来感受一下golang。它目前正在从表中获取wiki的信息,然后专门从单元格中获取信息。我目前身上没有该代码(目前不在家),但它看起来非常类似:

    func main() {
        doc, err := goquery.NewDocument("http://monsterhunter.wikia.com/wiki/MH4:_Item_List")
        if err != nil {
                log.Fatal(err)
        }

        doc.Find("tbody").Each(func(i int, s *goquery.Selection) {
                title := s.Find("td").Text()
                fmt.Printf(title)
        })
}

问题是,在这个网站上,第一个单元格是一个图像,所以它会打印我不想要的图像源。如何忽略大表每行中的第一个单元格?

让我们澄清一些问题。是一组符合某些条件的节点

doc.Find()
返回一个新的
选择
,其中包含与条件匹配的元素。对集合的每个元素进行迭代,并调用传递给它的函数值

因此,在您的情况下,
Find(“tbody”)
将查找所有
tbody
元素,
Each()
将迭代所有
tbody
元素并调用您的匿名函数

在匿名函数
s
中有一个
选择
tbody
元素。调用
s.Find(“td”)
将返回一个新的
选择
,该选择将包含当前表的
td
元素。因此,当您调用它时,它将是每个
td
元素(包括其子元素)的组合文本内容。这不是你想要的

您应该在
s.Find(“td”)
返回的
选择中调用另一个
Each()
。并检查传递给第二个匿名函数的
选择是否有
img
子项

示例代码:

doc.Find("tbody").Each(func(i int, s *goquery.Selection) {
    // s here is a tbody element
    s.Find("td").Each(func(j int, s2 *goquery.Selection) {
        // s2 here is a td element
        if s3 := s2.Find("img"); s3 != nil && s3.Length() > 0 {
            return // This TD has at least one img child, skip it
        }
        fmt.Printf(s2.Text())
    })
})
或者,您可以搜索
tr
元素,并通过检查传递给第三个匿名函数的索引是否为
0
(第一个子项),跳过每行的第一个子项,如下所示:

doc.Find("tbody").Each(func(i int, s *goquery.Selection) {
    // s here is a tbody element
    s.Find("tr").Each(func(j int, s2 *goquery.Selection) {
        // s2 here is a tr element
        s2.Find("td").Each(func(k int, s3 *goquery.Selection) {
            // s3 here is a td element
            if k == 0 {
                return // This is the first TD in the row
            }
            fmt.Printf(s3.Text())
        })
    })
})

您可以在没有子元素的情况下查找
td
,找到一个
锚元素。好的,我可以试着找出如何做到这一点。我只是试着将标题切分以获得前4个字符,因为它们都是以“哦,好的,我明白了,非常感谢你!这些都非常有用@icza如何将其修改为能够处理空的
?当我有
时,我得到了这个错误:
恐慌:运行时错误:索引超出范围
@Kaah我没有看到你的代码,我不知道恐慌发生在哪里。最好是把它作为一个新问题发布。