以通用方式使用 html.ParseFragment

使用实验code.google.com/p/go.net/html包,我们可以ParseFragment用来解析 HTML 文档的某些子部分。


像这样:


var s = `

    <option id="foo">first</option>

    <option Class="tester">second</option>

    <option>third</option>

`

doc, err := html.ParseFragment(strings.NewReader(s), &html.Node{

    Type: html.ElementNode,

    Data: "body",

    DataAtom: atom.Body,

})

这适用于大多数元素。但是当某些元素位于 HTML 的根位置时,它似乎不起作用,例如tbody, tr, and td(也许还有其他元素,不确定)。它只是忽略标签,只提供文本内容。


这可以通过提供语义正确的父级而不是 来补救atom.Body,但这需要我们提前知道 HTML 将是什么。


我希望有一个像 的通用根atom.DocumentFragment,但我没有看到。那么是否有某种方法可以使用它来处理任何任意 HTML 片段?


侃侃尔雅
浏览 267回答 1
1回答

拉丁的传说

ParseFragment总是上下文敏感的,因为它遵循 HTML5 片段解析算法。该算法是为实现 DOM innerHTML 属性而设计的,从给定的 innerHTML 字符串生成正确的树取决于周围的上下文(尤其是上下文是否在表中)。所以html包无法独立于上下文解析 HTML 片段。如果您需要有关解析如何取决于上下文的更多信息,请参阅http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#reset-the-insertion-mode-properly
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go