我可以阻止 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/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自己的代码。
在解析片段时,是否可以让 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/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自己的代码。