如何在AngleSharp中只加载特定的元素?

本文关键字:元素 加载 AngleSharp | 更新日期: 2023-09-27 18:17:13

我正在使用AngleSharp来解析HTML5我正在做的是将我想要解析的元素用一些HTML包装起来使其成为有效的HTML5然后使用解析器,还有更好的方法吗?也就是说,直接解析特定元素并验证结构确实是HTML5?

如何在AngleSharp中只加载特定的元素?

嗯,一个小例子会很好。但AngleSharp确实支持片段解析,这听起来像是你想要的。一般来说,片段解析也适用于设置像InnerHtml这样的属性,它将字符串转换为DOM节点。

您可以使用HtmlParser类的ParseFragment方法来获得给定源代码中包含的节点列表。一个例子:

using AngleSharp.Parser.Html;
// ...
var source = "<div><span class=emphasized>Works!</span></div>";
var parser = new HtmlParser();
var nodes = parser.ParseFragment(source, null);//null = no context given
if (nodes.Length == 0)
    Debug.WriteLine("Apparently something bad happened...");
foreach (var node in nodes)
{
    // Examine the node
}

通常所有节点都是ITextIElement类型。注释(IComment)也是可能的。您永远不会看到IDocumentIDocumentFragment节点附加到这样的INodeList。然而,由于HTML5非常健壮,使用这种方法很可能永远不会遇到"错误"。

您可以做的是查找(解析)错误。您需要提供一个公开事件聚合器的IConfiguration,该聚合器收集此类事件。仅聚合此类事件(不可能添加/删除多个处理程序)的最简单实现如下:

using AngleSharp.Events;
// ...
class SimpleEventAggregator : IEventAggregator
{
    readonly List<HtmlParseErrorEvent> _errors = new List<HtmlParseErrorEvent>();
    public void Publish<TEvent>(TEvent data)
    {
        var error = data as HtmlParseErrorEvent;
        if (error != null)
            _errors.Add(error);
    }
    public List<HtmlParseErrorEvent> Errors
    {
        get { return _errors; }
    }
    public void Subscribe<TEvent>(ISubscriber<TEvent> listener) { }
    public void Unsubscribe<TEvent>(ISubscriber<TEvent> listener) { }
}
在配置中使用事件聚合器的最简单方法是实例化一个新的(已提供的)Configuration。下面是一个示例代码片段:
using AngleSharp;
// ...
var errorEvents = new SimpleEventAggregator();
var config = new Configuration(events: errorEvents);

请注意:报告的每个错误都是"官方"错误(根据W3C规范)。这些错误并不表明所提供的代码是恶意的或无效的,只是说明某些东西不符合规范,并且必须应用回退。

希望这能回答你的问题。如果没有,请告诉我。

Update更新了最新版本AngleSharp的答案