2009-06-30 20 views
52

Html Agility Packは、しばらく前にStackOverflow questionへの回答として与えられましたが、それでも最適な選択肢ですか?考慮すべき他の選択肢は何ですか?もっと軽量なものがありますか?Html Agility Packはまだ最高の.NET HTMLパーサーですか?

+0

HTMLパーサーの欠如は、.NET標準ライブラリからの目立たない欠点です。 「HTTPリクエストを作成してレスポンスを解析する」は、Webの時代にはパンとバターであ​​り、第2のプログラムは「hello world」の後に書いています。 –

+0

@ColonelPanic、最近では、ほとんどのWebページでjscriptを使用してデータを取得すると、HTMLパーサー以上のものが必要になります。 –

+0

2015年12月の見直しhttp://forcewake.me/how-to-parse-html-in-dotnet/、AngleSharpは積極的に維持されています(https://dotnet.libhunt.com/project/anglesharp/vs/htmlagilitypack) –

答えて

49

比較のあるspreadsheetがあります。要約すると

:Htmlの敏捷性パックとFizzler対

CsQueryパフォーマンス私は一緒に私は(Fizzler、HtmlAgilityPack拡張子)を知っている唯一の実用的な 代替にCsQueryを比較する いくつかのパフォーマンステストを置きます。私 は、3つの異なる文書に対してテスト:

  • シズルテスト文書(約11 K)
  • "チーズ"(約170 K)
  • 単一ページのHTML 5仕様のためのWikipediaのエントリ(約6メガバイト)

は、全体的な結果は以下のとおりです。

  • HAPは、HTMLへの文字列をロードする時に高速でありますnオブジェクトモデル。これは理にかなっています。なぜなら私はFizzlerがインデックスを構築するとは思わないからです(あるいは おそらく比較的シンプルなものだけを構築します)。 CsQueryは、ドキュメントをロードするのに、どこからでも を1.1から2.6x長く持ちます。この詳細については をご覧ください。
  • CsQueryは他のほとんどのものより高速です。時には10,000以上の要因によって。 1つの例外は "*"セレクタで、 がFizzlerの方が速い場合があります。すべてのテストでは、結果は完全に です。この場合、ツリー内のすべてのノードは として列挙されます。したがって、これは選択エンジンを のデータ構造体ほどテストしません。
  • CsQueryはブラウザと同じ結果を返す際に優れた仕事をしました。ここの各セレクタは、 のjquery 1.7.2を使用している同じドキュメントと照合され、数字は CsQueryによって返されたものと一致します。これは、HtmlAgilityPackがオプションの (missing)タグを別々に処理するためです。さらに、nth-childはFizzlerで完全に に実装されていません。単純値(数式ではありません)のみをサポートしています。
+0

アルセドニウムもこのリストの一部でなければなりません。それはさらにクーラー、それは評価し、Javascriptを実行することができます! – jessehouwing

+0

http://www.awesomium.com/ – jessehouwing

+2

Html Agility Packは、Awesoniumと同様にHTMLパーサで、ヘッドレスブラウザではありません。 –

2

私はこの前にかなり使いやすいAPIを使いました。私はC#/。ネットドメインで、これは非常に良い選択だと思います。

Javaライブラリhereがあります。私は個人的な経験がないにもかかわらず、かなり良いように見えます。

1

あなたが 、.NET世界の外に見えるように準備している場合Python SOコミュニティは、たとえばhtml-parser-in-pythonためBeautiful Soup、 を推奨しています。

Beautiful Soupはスクリーンスクレイピングのような迅速な処理プロジェクト用に設計されたPython HTML/XMLパーサーです。

9

Htmlの敏捷性パックは、HTML敏捷性パックは、まだHTMLを解析するための優れたソリューションです

いくつかの時間前にStackOverflowの質問への答えとして与えられました。

まだベストのオプションですか?

ベスト?まあ、すべて手元の仕事に依存しますが、一般的に私はそう思っています。理想的ではない場合がありますが、一般的には素晴らしい仕事をします。

さらに軽量ですか?

あなたはこれを試みることができる:http://csharptest.net/browse/src/Library/Html/ それはより多くの何もない手フル正規表現を経由して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 parse HTML!それ以来、どこにでも埋め込むことができるほど軽量であるため、実際には多くの用途があります。 DOM階層のビルダーを混乱させる方法はまだありますが、パーサーが処理できないHTMLは見つかりませんでした。

+0

テキストには「ExampleAttribute」が使用されています。 =) –

33

HTML解析では、本物との比較はありません。これはC# port of the validator.nuパーサーです。これは、Geckoベースのブラウザ(Firefoxなど)で使用されるのと同じコードベースです。そこにレポはちょっと埃が多いようだが、だまされてはいけない。ポートは目立つ。それはちょうど見過ごされています。私はそれを約1ヶ月前にCsQueryに統合しました。すべてのCsQueryテスト(C#に移植されたほとんどのjQueryとSizzleテストを含む)に合格します。

私はC#で書かれた他のHTML5パーサー、あるいは欠けている、オプションで、そして無効なタグ処理の点で遠く離れたものを知っていません。これは単に偉大な仕事をするのではなく、標準に準拠しています。

上記にリンクされたリポジトリは元のポートであり、XMLノードツリーを生成する基本ラッパーを含みます。 CsQueryバージョン1.3以降では、このパーサを使用します。

+8

私は、受け入れられた答えが_your_ブログの記事へのリンクであり、_you_を引用する段落であるという事実を愛しています。勝利のための+ 400の評判、ハハ。 –

2

あなたの質問では、信頼性の高いツールを探していると思いますので、この機能を考慮する必要があります。 私はツールを提供する会社のサポートと強みを探します。 使用しているツールのサポートに連絡しようとすると、この会社はもはや存在しません。 HAPは開発者コミュニティによって維持されているので、私はむしろ彼女を信頼したいと思います。

7

AngleSharp

AngleSharpは、あなたのHTML、SVG、MathMLのと同様アングルブラケットベースのハイパーテキストを解析することができます.NETライブラリもありです。バリデーションのないXMLもライブラリによってサポートされています。 AngleSharpの重要な側面は、CSSも解析できることです。パーサは、公式のW3C仕様に基づいて構築されています。これにより、特定のソースコードの完全な移植性のあるHTML5 DOM表現が生成されます。 querySelectorやquerySelectorAllなどの現在の機能も、ツリートラバーサルで機能します。

関連する問題