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

时间:2016-08-19 16:38:15

标签: anglesharp

在解析片段时,无论如何让AngleSharp 创建完整的HTML文档。例如,如果我解析:

DocumentElement.OuterHtml

我在<html><head><title>The Title</title></head><body></body></html> 中获得了完整的HTML文档:

<p>The Paragraph</p>

如果我解析:

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

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

HEAD

请注意,AngleSharp非常聪明,可以知道我的片段应该去哪里。在一种情况下,它会将其放在BODY标记中,而在另一种情况下,它会将其放在Body.InnerHtml标记中。

这很聪明,但如果我只想让片段退出,我就不知道从哪里得到它。所以,我不能只调用Head.InnerHtml,因为根据我解析的HTML,我的片段可能会在{{1}}中。

有没有办法让AngleSharp不能创建完整的文档,还是有其他方法可以在解析后将我的孤立片段恢复出去?

2 个答案:

答案 0 :(得分:2)

现在有可能。以下是从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的第二个参数用于指定片段的解析上下文。在您的情况下,您需要在<title>的上下文中解析dom.Head和在p的{​​{1}}中进行解析。

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

答案 1 :(得分:1)

我了解到这是不可能的。 AngleSharp旨在生成一个完全像HTML规范所说的DOM。如果您使用上面的代码创建HTML文档,请在浏览器中打开它,然后检查DOM,您将找到完全相同的情况。 AngleSharp符合规定。

然后可以操纵的文件。

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