我发现它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>
撒科打诨
相关分类