亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我需要 html.Parse() 無法解析的 HTML

我需要 html.Parse() 無法解析的 HTML

Go
嚕嚕噠 2023-07-10 16:43:45
我正在編寫一個 Go 函數來讀取 HTML 響應正文并提取頁面標題。總的來說,該函數工作得很好,但我想測試響應正文根本不是正確 HTML 的代碼路徑。我為單元測試創建一些無效 HTML 的簡單嘗試已經失敗。顯然,根據html.Parse文檔,這是因為:HTML5 解析算法 [...] 非常復雜。<tag>生成的樹可以包含隱式創建的節點,這些節點在 r 的數據中沒有顯式列出,并且節點的父節點可能與 start 和 end 的簡單處理所隱含的嵌套不同<tag>。相反,<tag>r 數據中的顯式 s 可以被靜默刪除,而生成的樹中沒有相應的節點。下面是一些代碼,展示了我一直在采取的方法: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)? ? ? ? }? ? }}愚蠢的我,我本以為其中許多會產生錯誤,因為從表面上看它們是無效的 HTML,但上面的代碼在沒有 'ing 的情況下遍歷所有輸入字符串&mdash;&mdash;也就是說,沒有panic非nil errfrom html.Parse()。我想我很感激一個寬松/寬容的 HTML 解析器,但是:有沒有人有一個在輸入 Go 時會產生錯誤的文本示例html.Parse()?
查看完整描述

1 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

似乎唯一返回的錯誤可能是:

  • io.EOF 一旦 r 完全讀取成功;

  • 底層 io.Reader 返回的任何其他錯誤;或者

  • html.ErrBufferExceeded

在初始讀取后如何觸發 ErrBufferExceeded 對我來說并不明顯,但您可以通過提供虛擬讀取器來觸發 html.Parse 的錯誤:

type ErrReader struct { Error error }


func (e *ErrReader) Read([]byte) (int, error) {

? ? return nil, e.Error

}

https://play.golang.org/p/s78HpfMLAI8

希望有幫助


查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號