我发现它html.NewTokenizer()不会自动修复某些问题。因此,您可能会得到一个杂乱的结束标记 ( html.EndTagToken)。<div></p></div>也会这样html.StartTagToken, html.EndTagToken, html.EndTagToken。是否有推荐的解决方案来处理忽略/删除/修复这些标签?我的第一个猜测是[]atom.Atom在开始/结束每个标签时手动保留一个切片并推送/弹出到列表(在比较标签以确保您没有得到意外的结束标签之后)。下面是一些代码来演示这个问题:var err errorhtm := `<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>
1 回答
撒科打诨
TA贡献1934条经验 获得超2个赞
net/html
FWIW,当你使用它的方法时,似乎可以解决这些问题Parse
。
package main
import (
"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)
}
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消