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 關注
- 126 瀏覽
添加回答
舉報