在Go中解析HTML input标签:如何绕过官方包的忽略限制?
解决golang.org/x/net/html解析时未捕获input标签的问题
哎,其实你遇到的不是解析包忽略input标签的问题,而是你的代码只处理了开始标签(StartTagToken),但<input>属于自闭合标签,解析器会把它识别为自闭合标签(SelfClosingTagToken),所以你的循环没捕获到它~
最优的解决办法就是在判断标签类型时,同时包含html.SelfClosingTagToken,这样就能把input这类自闭合标签也捞出来了。
先看修改后的代码:
package main import ( "fmt" "strings" "golang.org/x/net/html" ) const HTML = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <title>selected attribute</title> </head> <body> <form method="GET"> <input type="submit" value="submit"/> </form> </body> </html> ` func main() { z := html.NewTokenizer(strings.NewReader(HTML)) tt := html.TokenType(7) for tt != html.ErrorToken { tt = z.Next() // 同时处理开始标签和自闭合标签 if tt == html.StartTagToken || tt == html.SelfClosingTagToken { name, _ := z.TagName() fmt.Println(string(name)) } } }
运行这段代码,你就能看到输出里包含input了,顺序是html、head、meta、title、body、form、input,完全符合预期。
另外,如果你想更清晰地处理Token,也可以用z.Token()方法获取完整的Token结构体,然后判断它的类型,代码逻辑会更直观:
func main() { z := html.NewTokenizer(strings.NewReader(HTML)) for { tt := z.Next() if tt == html.ErrorToken { break } token := z.Token() if token.Type == html.StartTagToken || token.Type == html.SelfClosingTagToken { fmt.Println(token.Data) } } }
本质上都是同一个思路:不要漏掉自闭合标签的类型判断,因为HTML里像input、img、br这类元素都是自闭合的,解析器不会把它们当成普通的开始标签处理。
内容的提问来源于stack exchange,提问作者user6216224
相关产品推荐
相关产品推荐

