3 回答
TA贡献1772条经验 获得超5个赞
Tokenizer 有一种有趣的界面,你不能Token()
在两次调用之间多次调用Next()
. 正如文档所说:
在 EBNF 表示法中,每个令牌的有效调用序列是:
Next {Raw} [ Token | Text | TagName {TagAttr} ]
也就是说:调用后Next()
可能调用Raw()
零次或多次;那么你可以:
调用
Token()
一次,调用
Text()
一次,调用
TagName()
一次,然后调用TagAttr()
零次或多次(大概是根本不调用,因为您不关心属性,或者调用的次数足以检索所有属性)。或者什么也不做(也许你正在跳过令牌)。
乱序调用的结果是不确定的,因为这些方法修改了内部状态——它们不是纯粹的访问器。在您的第一个片段中,您在Token()
两次调用之间调用了多次Next()
,因此结果无效。所有属性都由第一次调用使用,而不会由后面的调用返回。
TA贡献1946条经验 获得超3个赞
不是空的,您只需要遍历它并查看值。
package main
import (
"fmt"
"strings"
"golang.org/x/net/html"
)
func main() {
body := `
<html>
<body onload="fool()">
</body>
</html>
`
h := html.NewTokenizer(strings.NewReader(body))
for {
if h.Next() == html.ErrorToken {
break
}
attr := h.Token().Attr
l := len(attr)
if l != 0 {
fmt.Println("=======")
fmt.Println("Length", l) // greater than 0
for i, a := range attr {
fmt.Printf("Attr %d %v\n", i, a)
}
}
}
}
游乐场:https ://go.dev/play/p/lzEdppsURl0
- 3 回答
- 0 关注
- 95 浏览
添加回答
举报