Html Agility Pack は、先ほど StackOverflowの質問 への回答として提供されましたが、それでも最良のオプションですか?他にどのようなオプションを検討する必要がありますか?もっと軽量なものはありますか?
比較には spreadsheet があります。
要約すれば:
CsQueryパフォーマンスとHtml Agility PackとFizzlerの比較CsQueryを、私が知っている唯一の実用的な代替手段(Fizzler、HtmlAgilityPack拡張機能)と比較するためにいくつかのパフォーマンステストをまとめました。 3つの異なるドキュメントに対してテストしました。
- シズルテストドキュメント(約11 k)
- 「チーズ」のウィキペディアエントリ(約170 k)
- シングルページHTML 5仕様(約6メガバイト)
全体的な結果は次のとおりです。
- HAPは、HTMLの文字列をオブジェクトモデルにロードするときに高速です。 Fizzlerがインデックスを作成することはないと思うので(またはおそらく比較的単純なインデックスのみを作成するので)、これは理にかなっています。 CsQueryでは、ドキュメントの読み込みに1.1〜2.6倍の時間がかかります。これについては、以下で詳しく説明します。
- CsQueryは、他のほとんどすべてに対して高速です。時には10,000以上の要因で。 1つの例外は「*」セレクターです。このセレクターでは、Fizzlerの方が速い場合があります。すべてのテストで、結果は完全に列挙されます。この場合、ツリー内のすべてのノードが列挙されるだけです。したがって、これは選択エンジンをデータ構造ほどテストしません。
- CsQueryは、ブラウザーと同じ結果を返す点で優れています。ここでの各セレクターは、jQuery 1.7.2を使用してChromeで同じドキュメントに対して検証され、数値はCsQueryによって返されるものと一致します。これはおそらく、HtmlAgilityPackがオプションの(欠落)タグを異なる方法で処理するためです。さらに、nth-childはFizzlerで完全に実装されていません-単純な値のみをサポートしています(式はサポートしていません)。
HTMLの構文解析に関しては、実物との比較はありません。これは validator.nuのC#ポート パーサーです。これは、Geckoベースのブラウザー(Firefoxなど)で使用されているものと同じコードベースです。レポは少しほこりっぽく見えますが、だまされてはいけません。ポートは抜群です。見過ごされてきたばかりです。約1か月前に CsQuery に統合しました。すべてのCsQueryテストに合格します(C#に移植されたjQueryおよびSizzleテストのほとんどが含まれます)。
C#で記述された他のHTML5パーサー、あるいは欠落、オプション、および無効なタグ処理の点で優れた作業にリモートで近づくものさえ知りません。これは素晴らしい仕事をするだけでなく、標準に準拠しています。
上記にリンクしたリポジトリは元のポートで、XMLノードツリーを生成する基本的なラッパーが含まれています。 CsQueryバージョン1.3以降では、このパーサーを使用します。
AngleSharp もあります
AngleSharpは、HTML、SVG、MathMLなどの山かっこベースのハイパーテキストを解析できる.NETライブラリです。検証なしのXMLもライブラリでサポートされています。 AngleSharpの重要な側面は、CSSも解析できることです。パーサーは、公式のW3C仕様に基づいて構築されています。これにより、指定されたソースコードの完全に移植可能なHTML5 DOM表現が生成されます。また、querySelectorやquerySelectorAllなどの現在の機能は、ツリートラバーサルで機能します。
Html Agility Packは、先ほどStackOverflowの質問に対する回答として提供されました
Html Agility Packは、HTMLを解析するための優れたソリューションです。
まだbestオプションですか?
ベスト?それはすべて、手元のタスクに依存しますが、一般的にはそうだと思います。理想的とは言えない場合もありますが、一般的には非常に効果的です。
もっと軽量なものはありますか?
あなたはこれを試すことができます: 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は開発者コミュニティによって維持されているので、私はむしろ彼女を信頼したいと思います。
外を見る準備ができている場合、.NET
世界、Python
SOコミュニティは Beautiful Soup を推奨します(例 html-parser-in-python )。
Beautiful Soupは、Python HTML/XMLパーサーであり、画面スクレイピングなどの迅速なターンアラウンドプロジェクト用に設計されています。