9

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

<title>The Title</title>

我得到一个完整的 HTML 文档DocumentElement.OuterHtml

<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 不创建完整的文档,或者有没有其他方法可以在解析后恢复我的孤立片段?

4

2 回答 2

5

现在是可能的。以下是从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用于指定解析片段的上下文。在您的情况下,您将需要解析in和in<title>的上下文。dom.Headpdom.Body

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

于 2018-09-11T12:32:08.823 回答
2

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

可以做的是将其解析为抑制错误的 XML,这应该会导致文档自我纠正脏 HTML 问题,并为您提供一个“干净”的文档,然后可以对其进行操作。

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

于 2016-10-19T19:59:29.817 回答