html-parsing - 我如何获取 html.Node 的内容

标签 html-parsing go

我想使用来自 http://godoc.org/code.google.com/p/go.net/htmlGO 第 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/

相关文章:

python - 使用 Python 正则表达式查找两个变量之间的 HTML

http - 如何查看 HTTP/HTTPS 与 HTTP 客户端的交互

Golang 同步协程

每次测试后的golang测试方法 : undefined: testing. M

转到错误 : Cannot use argument (type []string) as type string in argument

Python bs4 删除 br 标签

character-encoding - Firefox 扩展中 XMLHTTPRequest 上的 HTML DOM 解析和字符编码

python - 查找包含给定文本的未知标签

mongodb - 如何构造和传递bson文件-Go lang?

javascript - 使用 Javascript 解析 HTML 中的 AJAX 响应