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

Ric*_*her 7 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())
}
Run Code Online (Sandbox Code Playgroud)

输出:

<html><head></head><body>Blah. <b>Blah.</b> Blah.</body></html>
Run Code Online (Sandbox Code Playgroud)

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

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

n = n.FirstChild.LastChild.FirstChild
Run Code Online (Sandbox Code Playgroud)

但至少可以说,这似乎很糟糕.

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

and*_*olm 12

您需要为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())
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*all 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