Html Agility Pack在一段时间之前作为StackOverflow question的答案给出了,它仍然是最好的选择吗?还应该考虑哪些其他选择?有更轻量级的东西吗?
答案 0 :(得分:53)
有一个spreadsheet的比较。
总结:
CsQuery性能与Html Agility Pack和Fizzler我放在一起 一些性能测试将CsQuery与唯一实用的比较 我所知道的另一种选择(Fizzler,一个HtmlAgilityPack扩展)。一世 测试了三个不同的文件:
- 嘶嘶声测试文件(约11 k)
- 维基百科条目“奶酪”(约170 k)
- 单页HTML 5规范(约6兆字节)
总体结果如下:
- HAP在将HTML字符串加载到对象模型中的速度更快。这是有道理的,因为我不认为Fizzler建立一个索引(或 也许它只构建一个相对简单的一个)。 CsQuery需要 加载文档的时间从1.1到2.6倍。更多关于此 下方。
- 几乎所有其他内容的CsQuery都更快。有时因数为10,000或更多。一个例外是“*”选择器,其中 有时Fizzler更快。对于所有测试,结果是完全的 列举;这种情况只会导致树中的每个节点都存在 列举。所以这并没有像选择引擎一样对选择引擎进行测试 数据结构。
- CsQuery在返回与浏览器相同的结果方面做得更好。这里的每个选择器都是根据同一文档进行验证的 Chrome使用jQuery 1.7.2,数字与返回的数字相匹配 CsQuery。这可能是因为HtmlAgilityPack处理可选 (缺少)标签不同。此外,没有实施nth-child 完全在Fizzler中 - 它只支持简单的值(而不是公式)。
答案 1 :(得分:36)
谈到HTML解析时,没有与真实的东西进行比较。这是一个C# port of the validator.nu解析器。这与基于Gecko的浏览器(例如Firefox)使用的代码库相同。回购看起来有点尘土飞扬,但不要被愚弄..港口非常出色。它被忽略了。我大约一个月前将它整合到CsQuery。它通过了所有CsQuery测试(包括大多数移植到C#的jQuery和Sizzle测试)。
我不知道用C#编写的任何其他HTML5解析器,或者甚至是任何在丢失,可选和无效标记处理方面做得很好的任何HTML5解析器。这不仅做得很好 - 它符合标准。
我上面链接的repo是原始端口,它包含一个生成XML节点树的基本包装器。 CsQuery 1.3及更高版本使用此解析器。
答案 2 :(得分:13)
AngleSharp是一个.NET库,它使您能够分析基于角括号的超文本,如HTML,SVG和MathML。库也支持未经验证的XML。 AngleSharp的一个重要方面是CSS也可以被解析。解析器基于官方W3C规范。这产生了给定源代码的完全可移植的HTML5 DOM表示。此外,当前的功能(如querySelector或querySelectorAll)也可用于树遍历。
答案 3 :(得分:10)
Html Agility Pack是前一段时间给出StackOverflow问题的答案
Html Agility Pack仍然是解析HTML的出色解决方案。
它仍然是最佳选项吗?
最佳?好吧,一切都取决于手头的任务,但一般来说我是这么认为的。有时它确实达不到理想状态,但通常它会做得很好。
有更轻量级的东西吗?
你可以试试这个:http://csharptest.net/browse/src/Library/Html/ 它只不过是通过Regex分离HTML / XML的手工文件。它支持轻量级DOM和XPath,但不是很多。 (help contents)
[实施例]
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:它是为解决内部辩论而编写的:Regex 可以解析HTML!从那时起,我们实际上已经找到了许多用途,因为它足够轻便可以嵌入任何地方。仍然存在混淆DOM层次结构构建器的方法,但是我没有找到任何解析器无法处理的HTML。答案 4 :(得分:2)
我以前使用过这个,非常容易流动的api。我认为在C#/ .net域中,这是一个非常好的选择。
有一个java库here。虽然我没有亲身经历,但看起来还不错。
答案 5 :(得分:2)
最好是一个非常相对的术语,对于你的问题,我想你正在寻找一个可靠的工具,所以我认为应该考虑这个功能。 我会寻找提供该工具的公司的支持和力量。 当您尝试联系支持任何使用的工具并且答案是,该公司不再存在时,这是一种可怕的感觉。 由于HAP由开发人员社区维护,我宁愿信任她。
答案 6 :(得分:1)
如果您准备在.NET
世界之外寻找,
Python
SO社区推荐Beautiful Soup,
例如html-parser-in-python。
Beautiful Soup是一个Python HTML / XML解析器,专为快速周转项目而设计,例如屏幕抓取。