7
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

但这似乎至少可以说是笨拙的。

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

4

2 回答 2

13

您需要为 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())
}
于 2013-02-26T04:22:25.797 回答
6

你想要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

于 2013-02-26T04:18:39.683 回答