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 に答える