golang 网络爬虫,忽略表格的特定单元格

我正在开发一个小型网络抓取工具,以了解 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)

        })

}

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


阿波罗的战车
浏览 196回答 1
1回答

白猪掌柜的

让我们澄清一些事情。ASelection是匹配某些条件的节点的集合。doc.Find()isSelection.Find()返回一个Selection包含与条件匹配的元素的新元素。并Selection.Each()迭代集合的每个元素并调用传递给它的函数值。因此,在您的情况下,Find("tbody")将找到所有tbody元素,Each()将遍历所有tbody元素并调用您的匿名函数。在您的匿名函数中s是Selection一个tbody元素。你叫s.Find("td")这将返回一个新的Selection,这将包含所有的td当前表的元素。所以当你调用Text()这个时,它将是每个td元素的组合文本内容,包括它们的后代。这不是你想要的。您应该做的是Each()在Selection返回的 by上调用另一个s.Find("td")。并检查Selection传递给第二个匿名函数是否有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元素并跳过td每行的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())        })    })})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go