猿问

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

我正在编写一个 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 的情况下遍历所有输入字符串&mdash;&mdash;也就是说,没有panic非nil errfrom html.Parse()。


我想我很感激一个宽松/宽容的 HTML 解析器,但是:有没有人有一个在输入 Go 时会产生错误的文本示例html.Parse()?


噜噜哒
浏览 213回答 1
1回答

HUWWW

似乎唯一返回的错误可能是: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希望有帮助
随时随地看视频慕课网APP

相关分类

Go
我要回答