我正在编写一个 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 的情况下遍历所有输入字符串——也就是说,没有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
希望有帮助
- 1 回答
- 0 关注
- 151 浏览
添加回答
举报
0/150
提交
取消