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
但是,至少可以说,这似乎很难说。
理想情况下,我想:接受输入,操作或删除其中的节点,并将结果写回字符串,即使结果是不完整的文档。
答案 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