Html Agility Pack 仍然是最好的 .NET HTML 解析器吗?[关闭]
-
21-08-2019 - |
题
Html 敏捷包 被给出作为答案 StackOverflow问题 前段时间,它仍然是最好的选择吗?还应考虑哪些其他选择?有没有更轻量的东西?
解决方案
有一个 电子表格 与比较。
总之:
CsQuery 性能对比HTML敏捷包和Fizzler,我整理了一些性能测试,以将Csquery与我所知道的唯一实用替代方案进行比较(Fizzler,HTMLagilityPack扩展名)。我对三个不同的文档进行了测试:
- 嘶嘶声测试文件(约11k)
- “奶酪”的维基百科条目(约 170 k)
- 单页 HTML 5 规范(约 6 MB)
总体结果是:
- HAP 将 HTML 字符串加载到对象模型中的速度更快。这是有道理的,因为我认为Fizzler不会构建索引(或者它仅构建一个相对简单的索引)。Csquery的时间为1.1至2.6倍,以加载文档。以下更多内容。
- CsQuery 对于几乎所有其他事情来说都更快。有时高达 10,000 倍或更多。一个例外是“*”选择器,有时Fizzler更快。对于所有测试,结果都是完全列举的。这种情况只会导致列出树中的每个节点。因此,这不会像数据结构那样测试选择引擎。
- CsQuery 在返回与浏览器相同的结果方面做得更好。使用jQuery 1.7.2在Chrome中使用同一文档验证了此处的每个选择器,并且数字与Csquery返回的数字相匹配。这可能是因为HTMLagilityPack处理可选(缺少)标签的方式不同。此外,第n -Child并未在Fizzler中完全实现 - 它仅支持简单的值(不是公式)。
其他提示
当涉及到HTML解析,没有比较真实的东西。这是validator.nu 解析器的 C#端口。这是通过基于Gecko的浏览器(例如火狐)中使用的相同的代码库。有回购看起来有点尘土飞扬,但不要被愚弄..端口为突出。这只是被忽视了。我将它纳入 CsQuery 大约一个月前。它通过了所有测试CsQuery(其包括大多数的jQuery和灒测试移植到C#)。
我不知道C#编写的任何其他HTML5分析器,甚至任何接近的缺失,可选的,无效的标记处理方面做得不好来进行远程的。这不只是做大量的工作,虽然 - 这是符合标准的。
我上方连结回购是原来的端口,它包括产生XML节点树基本包装。 CsQuery版本1.3和更高的使用这种解析器。
还有 AngleSharp
AngleSharp是一个NET库,让你解析角钢支架的基于超文本如HTML,SVG和MathML的能力。 XML未经验证也由库支持。 AngleSharp的一个重要方面是,CSS也可以被解析。解析器是在官方W3C规范建造。这会产生给定的源代码的一个完全便携式HTML5 DOM表示。也电流的功能,如querySelector或querySelectorAll工作了树的遍历。
HTML敏捷性包被给出的答案,StackOverflow的问题,前一段时间
在HTML敏捷性包仍然是解析HTML杰出的溶液。
是它仍然在最好的选项?
最佳?清楚,一切都取决于手头的任务,但一般来说,我是这么认为的。有些时候它确实达不到的是理想的,但一般会做大量的工作。
有更多的东西轻量级?
您可以试试这个: http://csharptest.net/browse/src/Library/ HTML / 这无非手满是挑除了通过正则表达式的HTML / XML的源文件。它支持一个轻量级的DOM和XPath,但仅此而已。 (帮助内容)
[实施例]
public void TestParse() {
string notxml = "<html id=a ><body foo='bar' bar=\"foo\" />";
var html = new HtmlLightDocument(notxml).Root;
Assert.AreEqual("html", html.TagName);
Assert.AreEqual(1, html.Attributes.Count);
Assert.AreEqual("a", html.Attributes["id"]);
Assert.AreEqual(1, html.Children.Count);
}
可替换地可以使用解析器,而不是直接构建DOM树。只需实现 IXmlLightReader 接口,并调用静态的 XmlLightParser.Parse 方法。
PS:这是写来解决一个内部的争论:该正则表达式的可以的解析HTML!从那以后,我们居然发现它的许多用途,因为它是重量足够轻的任何地方嵌入。还是有办法来迷惑DOM层次结构的建设者,但我还没有发现任何HTML解析器不会处理。
我以前使用这一点,很容易流API。我认为,在C#/。NET域名,这是一个非常不错的选择。
有是一个Java库此处。看起来很不错,即使我没有亲身经历。
最好的是一个非常相对的概念,对于你的问题,我想你正在寻找一个可靠的工具,所以我觉得这个功能应该被考虑在内。 我想寻找一个能提供工具的公司的支持和力量。 这是一种可怕的感觉,当你尝试联系使用,答案是任何工具的支持,这个公司已经不存在。 由于HAP是由开发者社区维持,我宁愿相信她。