dongshungou7699 2017-02-24 12:56
浏览 68
已采纳

为什么该程序不打印任何内容?

I'm trying to use Go to parse html. I would like to print the html to the terminal and I don't understand why this doesn't print anything:

package main

import (
        "fmt"
        "log"
        "net/http"

        "golang.org/x/net/html"
)

func main() {
        r, err := http.Get("https://google.com")
        if err != nil {
                log.Panicln(err)
        }

        defer func() {
                err := r.Body.Close()
                if err != nil {
                        fmt.Println(err)
                }
        }()

        node, err := html.Parse(r.Body)
        if err != nil {
                log.Panicln(err)
        }
        fmt.Println(node.Data)
}

I know there are different ways to print the html, but I don't understand why this in particular never prints anything no matter what website I use. Is this intended behavior?

Docs:

https://godoc.org/golang.org/x/net/html#Node

https://github.com/golang/net/blob/master/html/node.go#L38

  • 写回答

2条回答 默认 最新

  • donglu1913 2017-02-24 13:17
    关注

    Because it's a tree of the HTML. Upper level is empty. For example if you need parse all url from html:

    package main
    
    import (
            "fmt"
            "log"
            "net/http"
    
            "golang.org/x/net/html"
    )
    
    func main() {
            r, err := http.Get("https://google.com")
            if err != nil {
                    log.Panicln(err)
            }
    
            defer func() {
                    err := r.Body.Close()
                    if err != nil {
                            fmt.Println(err)
                    }
            }()
    
            node, err := html.Parse(r.Body)
            if err != nil {
                    log.Panicln(err)
            }
            fmt.Println(node.Data)
    
            var f func(*html.Node)
            f = func(n *html.Node) {
                if n.Type == html.ElementNode && n.Data == "a" {
                    for _, a := range n.Attr {
                        if a.Key == "href" {
                            fmt.Println(a.Val)
                            break
                        }
                    }
                }
                for c := n.FirstChild; c != nil; c = c.NextSibling {
                    f(c)
                }
            }
            f(node)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条