我想使用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)
}
}
- 1 回答
- 0 关注
- 272 浏览
添加回答
举报
0/150
提交
取消