web-dev-qa-db-ja.com

Html Agility Packは今でも最高の.NET HTMLパーサーですか?

Html Agility Pack は、先ほど StackOverflowの質問 への回答として提供されましたが、それでも最良のオプションですか?他にどのようなオプションを検討する必要がありますか?もっと軽量なものはありますか?

57
Ian Ringrose

比較には 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以降では、このパーサーを使用します。

36
Jamie Treworgy

AngleSharp もあります

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

13
Simon

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は見つかりませんでした。

10
csharptest.net

私はこれを以前に使用したことがあり、かなりフローしやすいAPIです。 C#/。Netドメインでは、これは非常に良い選択だと思います。

Javaライブラリ ここ があります。私は個人的な経験はありませんが、かなりよさそうです。

2
J.W.

あなたの質問では、私はあなたが信頼できるツールを探していると思いますので、この機能は考慮に入れられるべきだと思います。そのツールを提供する会社のサポートと強みを探します。を使用するツールのサポートに連絡しようとすると恐ろしい気持ちになります。その答えは、この会社はもう存在しないということです。 HAPは開発者コミュニティによって維持されているので、私はむしろ彼女を信頼したいと思います。

2
Ewerton

外を見る準備ができている場合、.NET世界、Python SOコミュニティは Beautiful Soup を推奨します(例 html-parser-in-python )。

Beautiful Soupは、Python HTML/XMLパーサーであり、画面スクレイピングなどの迅速なターンアラウンドプロジェクト用に設計されています。

1
gimel