为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
阿波罗的战车 2021-10-11 10:40:32
我正在开发一个小型网络抓取工具,以了解 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)        })}问题是在这个网站上,第一个单元格是一个图像,所以它打印了我不想要的图像源。如何忽略大表格每一行中的第一个单元格?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

让我们澄清一些事情。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())

        })

    })

})


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信