如何获取 html.Node 的内容

我想使用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

如果我想得到


Foo

BarBaz

我应该怎么办?


长风秋雁
浏览 277回答 1
1回答

牛魔王的故事

树<a href="link"><strong>Foo</strong>Bar</a>看起来基本上是这样的:ElementNode "a"(该节点还包括一个属性列表)文本节点“Foo”元素节点“强”文本节点“条”因此,假设您想要获取链接的纯文本(例如FooBar),您将不得不遍历树并收集所有文本节点。例如:func collectText(n *html.Node, buf *bytes.Buffer) {&nbsp; &nbsp; if n.Type == html.TextNode {&nbsp; &nbsp; &nbsp; &nbsp; buf.WriteString(n.Data)&nbsp; &nbsp; }&nbsp; &nbsp; for c := n.FirstChild; c != nil; c = c.NextSibling {&nbsp; &nbsp; &nbsp; &nbsp; collectText(c, buf)&nbsp; &nbsp; }}以及您功能的变化:var f func(*html.Node)f = func(n *html.Node) {&nbsp; &nbsp; if n.Type == html.ElementNode && n.Data == "a" {&nbsp; &nbsp; &nbsp; &nbsp; text := &bytes.Buffer{}&nbsp; &nbsp; &nbsp; &nbsp; collectText(n, text)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(text)&nbsp; &nbsp; }&nbsp; &nbsp; for c := n.FirstChild; c != nil; c = c.NextSibling {&nbsp; &nbsp; &nbsp; &nbsp; f(c)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go