3 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
Tokenizer 有一種有趣的界面,你不能Token()
在兩次調(diào)用之間多次調(diào)用Next()
. 正如文檔所說(shuō):
在 EBNF 表示法中,每個(gè)令牌的有效調(diào)用序列是:
Next {Raw} [ Token | Text | TagName {TagAttr} ]
也就是說(shuō):調(diào)用后Next()
可能調(diào)用Raw()
零次或多次;那么你可以:
調(diào)用
Token()
一次,調(diào)用
Text()
一次,調(diào)用
TagName()
一次,然后調(diào)用TagAttr()
零次或多次(大概是根本不調(diào)用,因?yàn)槟魂P(guān)心屬性,或者調(diào)用的次數(shù)足以檢索所有屬性)。或者什么也不做(也許你正在跳過(guò)令牌)。
亂序調(diào)用的結(jié)果是不確定的,因?yàn)檫@些方法修改了內(nèi)部狀態(tài)——它們不是純粹的訪問(wèn)器。在您的第一個(gè)片段中,您在Token()
兩次調(diào)用之間調(diào)用了多次Next()
,因此結(jié)果無(wú)效。所有屬性都由第一次調(diào)用使用,而不會(huì)由后面的調(diào)用返回。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
(*Tokenizer).Token()
每次都返回一個(gè)新的令牌,它再次有一個(gè)新的 []Attr,在這里.Token()
,下一次調(diào)用中的分詞器在第 1145 行的開始和結(jié)束是相同的數(shù)字,所以它不會(huì)進(jìn)入這個(gè)循環(huán),所以下次 attr 將為空。

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
不是空的,您只需要遍歷它并查看值。
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)
}
}
}
}
游樂場(chǎng):https ://go.dev/play/p/lzEdppsURl0
- 3 回答
- 0 關(guān)注
- 120 瀏覽
添加回答
舉報(bào)