以通用方式使用html.ParseFragment

时间:2014-01-29 03:50:13

标签: go

使用实验性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的根位置时,它似乎不起作用,例如tbodytrtd(也许还有其他元素,不确定)。它只是忽略标签而只提供文本内容。

这可以通过提供语义正确的父而不是atom.Body来解决,但这要求我们事先知道HTML将是什么。

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

1 个答案:

答案 0 :(得分:1)

ParseFragment始终是上下文敏感的,因为它遵循HTML5片段解析算法。该算法用于实现DOM innerHTML属性,从给定的innerHTML字符串生成的正确树取决于周围的上下文(特别是上下文是否在表中)。

因此html包无法独立于其上下文解析HTML片段。

如果您需要有关解析如何取决于上下文的更多信息,请参阅http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#reset-the-insertion-mode-appropriately