我想使用来自 http://godoc.org/code.google.com/p/go.net/html 的 GO
第 3 方库从 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
我该怎么办?
最佳答案
<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)
}
}
关于html-parsing - 我如何获取 html.Node 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274501/