为了账号安全,请及时绑定邮箱和手机立即绑定

我需要 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 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信