我可以阻止 AngleSharp 在解析片段时推断完整的 HTML 文档吗?

Can I prevent AngleSharp from extrapolating a full HTML document when parsing a fragment?

在解析片段时,是否可以让 AngleSharp 创建完整的 HTML 文档。例如,如果我解析:

<title>The Title</title>

我在 DocumentElement.OuterHtml 中获得了完整的 HTML 文档:

<html><head><title>The Title</title></head><body></body></html>

如果我解析:

<p>The Paragraph</p>

我得到另一个完整的 HTML 文档:

<html><head></head><body><p>Hey</p></body></html>

注意 AngleSharp 足够聪明,知道我的片段应该去哪里。在一种情况下,它把它放在 HEAD 标签中,在另一种情况下,它把它放在 BODY 标签中。

这很聪明,但如果我只是想把片段取回来,我不知道从哪里得到它。所以,我不能只调用 Body.InnerHtml,因为根据我解析的 HTML,我的片段可能在 Head.InnerHtml 中。

有没有办法让 AngleSharp 不创建完整文档,或者有其他方法让我的孤立片段在解析后恢复出来?

我了解到这是不可能的。 AngleSharp 旨在生成 DOM 与 HTML 规范所说的完全一样。如果你用我上面的代码创建一个 HTML 文档,在浏览器中打开它,然后检查 DOM,你会发现完全相同的情况。 AngleSharp 合规。

可以做的是将其解析为 XML 并抑制错误,这应该会导致文档自我更正脏 HTML 问题,并且给你一个 "clean" 文档,然后可以对其进行操作。

var html = "<x><y><z>foo</y></z></x>";
var options = new XmlParserOptions()
{
    IsSuppressingErrors = true
};
var dom = new XmlParser(options).Parse(html);

这里有一个问题,它不能完美地处理实体(这意味着它仍然会在这些实体上抛出一些错误,即使在被抑制时也是如此)。它在待修复列表中。

这是导致此答案的 GitHub 问题:

https://github.com/AngleSharp/AngleSharp/issues/398

现在可以了。下面是从 https://github.com/AngleSharp/AngleSharp/issues/594

复制的示例
var fragment = "<script>deane</script><div>deane</div>";
var p = new HtmlParser();
var dom = p.Parse("<html><body></body></html>");
var nodes = p.ParseFragment(fragment, dom.Body);

ParseFragment的第二个参数用于指定解析片段的上下文。在您的情况下,您需要在 dom.Head 的上下文中解析 <title> 并在 dom.Body.

中解析 p

哇哦,我刚刚复制的是OP自己的代码。