gpt4 book ai didi

c# - 如何在 AngleSharp 中只加载特定元素?

转载 作者:太空狗 更新时间:2023-10-30 00:31:31 32 4
gpt4 key购买 nike

我正在使用 AngleSharp要解析 HTML5,我现在正在做的是用一些 HTML 包装我想要解析的元素,使其成为有效的 HTML5,然后在其上使用解析器,有更好的做法吗?意思是,直接解析特定元素并验证该结构确实是 HTML5?

最佳答案

嗯,举个小例子就好了。但是 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) 也是可能的。您永远不会看到附加到此类 INodeListIDocumentIDocumentFragment 节点。但是,由于 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 规范)。这些错误并不表示提供的代码是恶意的或无效的,只是说明某些内容不符合规范并且必须应用回退。

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

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

关于c# - 如何在 AngleSharp 中只加载特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25225474/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com