You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:22:56