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

如何获取 html.Node 的内容

如何获取 html.Node 的内容

Go
长风秋雁 2021-06-22 09:00:47
我想使用GO来自http://godoc.org/code.google.com/p/go.net/html的3rd 方库从URL 获取数据。但是我遇到了一个问题,就是我无法获取一个 html.Node 的内容。参考文档中有示例代码,代码如下。s := `<p>Links:</p><ul><li><a href="foo">Foo</a><li><a href="/bar/baz">BarBaz</a></ul>`doc, err := html.Parse(strings.NewReader(s))if err != nil {    log.Fatal(err)}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(doc)输出是:foo/bar/baz如果我想得到FooBarBaz我应该怎么办?
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

<a href="link"><strong>Foo</strong>Bar</a>看起来基本上是这样的:

  • ElementNode "a"(该节点还包括一个属性列表)

    • 文本节点“Foo”

    • 元素节点“强”

    • 文本节点“条”

因此,假设您想要获取链接的纯文本(例如FooBar),您将不得不遍历树并收集所有文本节点。例如:

func collectText(n *html.Node, buf *bytes.Buffer) {

    if n.Type == html.TextNode {

        buf.WriteString(n.Data)

    }

    for c := n.FirstChild; c != nil; c = c.NextSibling {

        collectText(c, buf)

    }

}

以及您功能的变化:


var f func(*html.Node)

f = func(n *html.Node) {

    if n.Type == html.ElementNode && n.Data == "a" {

        text := &bytes.Buffer{}

        collectText(n, text)

        fmt.Println(text)

    }

    for c := n.FirstChild; c != nil; c = c.NextSibling {

        f(c)

    }

}


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

添加回答

举报

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