Html Agility Pack仍然是最好的.NET HTML解析器吗?

时间:2009-06-30 17:45:32

标签: c# .net html parsing html-agility-pack

Html Agility Pack在一段时间之前作为StackOverflow question的答案给出了,它仍然是最好的选择吗?还应该考虑哪些其他选择?有更轻量级的东西吗?

7 个答案:

答案 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

  

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解析器,专为快速周转项目而设计,例如屏幕抓取。

相关问题