任何方式使用html.Parse而不添加节点来构建“格式良好的树”?

时间:2013-02-26 04:01:28

标签: go

package main

import (
    "bytes"
    "code.google.com/p/go.net/html"
    "fmt"
    "log"
    "strings"
)

func main() {
    s := "Blah. <b>Blah.</b> Blah."
    n, err := html.Parse(strings.NewReader(s))
    if err != nil {
        log.Fatalf("Parse error: %s", err)
    }
    var buf bytes.Buffer
    if err := html.Render(&buf, n); err != nil {
        log.Fatalf("Render error: %s", err)
    }
    fmt.Println(buf.String())
}

输出:

<html><head></head><body>Blah. <b>Blah.</b> Blah.</body></html>

有没有办法阻止html.Parse用片段制作文档(即避免添加<html><body>等)?我知道html.ParseFragment但它似乎表现出相同的行为。

您可以通过使用<span>这样的父元素包装要解析的文本来解决它,然后执行以下操作:

n = n.FirstChild.LastChild.FirstChild

但是,至少可以说,这似乎很难说。

理想情况下,我想:接受输入,操作或删除其中的节点,并将结果写回字符串,即使结果是不完整的文档。

2 个答案:

答案 0 :(得分:11)

您需要为ParseFragment提供上下文。以下程序打印出原始文本:

package main

import (
    "bytes"
    "code.google.com/p/go.net/html"
    "code.google.com/p/go.net/html/atom"
    "fmt"
    "log"
    "strings"
)

func main() {
    s := "Blah. <b>Blah.</b> Blah."
    n, err := html.ParseFragment(strings.NewReader(s), &html.Node{
        Type:     html.ElementNode,
        Data:     "body",
        DataAtom: atom.Body,
    })
    if err != nil {
        log.Fatalf("Parse error: %s", err)
    }
    var buf bytes.Buffer
    for _, node := range n {
        if err := html.Render(&buf, node); err != nil {
            log.Fatalf("Render error: %s", err)
        }
    }
    fmt.Println(buf.String())
}

答案 1 :(得分:5)

你想要http://godoc.org/code.google.com/p/go.net/html#ParseFragment。传入假的Body元素作为您的上下文,片段将作为片段中元素的一部分返回。

你可以在go-html-transform的go.net/html包装包的Partial *函数中看到一个例子。 https://code.google.com/p/go-html-transform/source/browse/h5/h5.go#32