我正在編寫一個 Go 函數(shù)來讀取 HTML 響應(yīng)正文并提取頁面標(biāo)題。總的來說,該函數(shù)工作得很好,但我想測試響應(yīng)正文根本不是正確 HTML 的代碼路徑。我為單元測試創(chuàng)建一些無效 HTML 的簡單嘗試已經(jīng)失敗。顯然,根據(jù)html.Parse文檔,這是因為:HTML5 解析算法 [...] 非常復(fù)雜。<tag>生成的樹可以包含隱式創(chuàng)建的節(jié)點,這些節(jié)點在 r 的數(shù)據(jù)中沒有顯式列出,并且節(jié)點的父節(jié)點可能與 start 和 end 的簡單處理所隱含的嵌套不同<tag>。相反,<tag>r 數(shù)據(jù)中的顯式 s 可以被靜默刪除,而生成的樹中沒有相應(yīng)的節(jié)點。下面是一些代碼,展示了我一直在采取的方法:https://play.golang.org/p/T5WjdtjNcqqpackage mainimport (? ? "bytes"? ? "fmt"? ? "golang.org/x/net/html")func main() {? ? inputs := []string{ "",? ? ? ? "~",? ? ? ? "<",? ? ? ? "<ht",? ? ? ? "<html",? ? ? ? "<html>",? ? ? ? "<html><",? ? ? ? "<html><titl",? ? ? ? "<html><title",? ? ? ? "<html><title>",? ? ? ? "<html><title>The C Progr",? ? ? ? "<html><title>The C Programming Language",? ? ? ? "<html><title>The C Programming Language<",? ? ? ? "<html><title>The C Programming Language</",? ? ? ? "<html><title>The C Programming Language</ti",? ? ? ? "<html><title>The C Programming Language</title",? ? ? ? "<html><title>The C Programming Language</title>",? ? ? ? "<html><title>The C Programming Language</title><",? ? ? ? "<html><title>The C Programming Language</title></",? ? ? ? "<html><title>The C Programming Language</title></ht",? ? ? ? "<html><title>The C Programming Language</title></html",? ? ? ? "<html><title>The C Programming Language</title></html>",? ? }? ? for _, in := range inputs {? ? ? ? fmt.Printf("%s\n", in)? ? ? ? r := bytes.NewReader([]byte(in))? ? ? ? _, err := html.Parse(r)? ? ? ? if err != nil {? ? ? ? ? ? fmt.Printf("COULD NOT PARSE HTML\n")? ? ? ? ? ? panic(err)? ? ? ? }? ? }}愚蠢的我,我本以為其中許多會產(chǎn)生錯誤,因為從表面上看它們是無效的 HTML,但上面的代碼在沒有 'ing 的情況下遍歷所有輸入字符串——也就是說,沒有panic非nil errfrom html.Parse()。我想我很感激一個寬松/寬容的 HTML 解析器,但是:有沒有人有一個在輸入 Go 時會產(chǎn)生錯誤的文本示例html.Parse()?
1 回答

HUWWW
TA貢獻(xiàn)1874條經(jīng)驗 獲得超12個贊
似乎唯一返回的錯誤可能是:
io.EOF 一旦 r 完全讀取成功;
底層 io.Reader 返回的任何其他錯誤;或者
html.ErrBufferExceeded
在初始讀取后如何觸發(fā) ErrBufferExceeded 對我來說并不明顯,但您可以通過提供虛擬讀取器來觸發(fā) html.Parse 的錯誤:
type ErrReader struct { Error error }
func (e *ErrReader) Read([]byte) (int, error) {
? ? return nil, e.Error
}
https://play.golang.org/p/s78HpfMLAI8
希望有幫助
- 1 回答
- 0 關(guān)注
- 198 瀏覽
添加回答
舉報
0/150
提交
取消