无论如何都要让AngleSharp 在解析片段时不创建完整的HTML文档.例如,如果我解析:
<title>The Title</title>
Run Code Online (Sandbox Code Playgroud)
我得到一个完整的HTML文档DocumentElement.OuterHtml
:
<html><head><title>The Title</title></head><body></body></html>
Run Code Online (Sandbox Code Playgroud)
如果我解析:
<p>The Paragraph</p>
Run Code Online (Sandbox Code Playgroud)
我得到另一个完整的HTML文档:
<html><head></head><body><p>Hey</p></body></html>
Run Code Online (Sandbox Code Playgroud)
请注意,AngleSharp足够聪明,可以知道我的片段应该去哪里.在一种情况下,它将它放在HEAD
标签中,而在另一种情况下,它将它放在BODY
标签中.
这很聪明,但如果我只想让片段退出,我不知道从哪里得到它.所以,我不能只是调用Body.InnerHtml
因为根据我解析的HTML,我的片段可能在其中Head.InnerHtml
.
有没有办法让AngleSharp不能创建一个完整的文档,还是有其他方法可以在解析后将我的孤立片段退出?
现在有可能了。下面是从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);
Run Code Online (Sandbox Code Playgroud)
第二个参数ParseFragment
用于指定解析片段的上下文。在您的情况下,您需要解析in和in的<title>
上下文。dom.Head
p
dom.Body
哇哦,这是我刚刚复制的OP自己的代码。
我知道这是不可能的。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);
Run Code Online (Sandbox Code Playgroud)
这里有一个问题,因为它不能完美地处理实体(这意味着即使被抑制,它仍然会抛出一些错误)。它在待修复的列表中。
这是导致此答案的 GitHub 问题:
https://github.com/AngleSharp/AngleSharp/issues/398
归档时间: |
|
查看次数: |
649 次 |
最近记录: |