猿问

Go GCP Cloud PubSub 不批量发布消息

我发现它html.NewTokenizer()不会自动修复某些问题。因此,您可能会得到一个杂乱的结束标记 ( html.EndTagToken)。<div></p></div>也会这样html.StartTagToken, html.EndTagToken, html.EndTagToken

是否有推荐的解决方案来处理忽略/删除/修复这些标签?

我的第一个猜测是[]atom.Atom在开始/结束每个标签时手动保留一个切片并推送/弹出到列表(在比较标签以确保您没有得到意外的结束标签之后)。

下面是一些代码来演示这个问题:

var err error

htm := `<div><div><p></p></p></div>`


tokenizer := html.NewTokenizer(strings.NewReader(htm))


for {


    if tokenizer.Next() == html.ErrorToken {

        err = tokenizer.Err()

        if err == io.EOF {

            err = nil

        }


        return

    }


    token := tokenizer.Token()


    switch token.Type {

    case html.DoctypeToken:

        continue

    case html.CommentToken:

        continue

    case html.SelfClosingTagToken:

        fmt.Println(token.Data)

        continue

    case html.StartTagToken:

        fmt.Printf("<%s>\n", token.Data)


    case html.EndTagToken:

        fmt.Printf("</%s>\n", token.Data)


    case html.TextToken:

        continue

    default:

        continue

    }

}

输出:


<div>

<div>

<p>

</p>

</p>

</div>


慕娘9325324
浏览 109回答 1
1回答

撒科打诨

net/htmlFWIW,当你使用它的方法时,似乎可以解决这些问题Parse。package mainimport (    "bytes"    "fmt"    "log"    "strings"    "golang.org/x/net/html")func main() {    brokenHtml := `<div><div><p></p></p></div>`    reader := strings.NewReader(brokenHtml)    root, err := html.Parse(reader)    if err != nil {        log.Fatal(err)    }    var b bytes.Buffer    html.Render(&b, root)    fixedHtml := b.String()    fmt.Println(fixedHtml)}
随时随地看视频慕课网APP

相关分类

Go
我要回答