我正在编写一个 Go 函数来读取 HTML 响应正文并提取页面标题。总的来说,该函数工作得很好,但我想测试响应正文根本不是正确 HTML 的代码路径。我为单元测试创建一些无效 HTML 的简单尝试已经失败。
显然,根据html.Parse
文档,这是因为:
HTML5 解析算法 [...] 非常复杂。
<tag>
生成的树可以包含隐式创建的节点,这些节点在 r 的数据中没有显式列出,并且节点的父节点可能与 start 和 end 的简单处理所隐含的嵌套不同<tag>
。相反,<tag>
r 数据中的显式 s 可以被静默删除,而生成的树中没有相应的节点。
下面是一些代码,展示了我一直在采取的方法:
https://play.golang.org/p/T5WjdtjNcqq
package main
import (
"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()?
HUWWW
相关分类