Html Agility Packを使用してHTMLフラグメントを解析できますか?

.net c# html html-agility-pack parsing

質問

ASP.NETページ、ユーザーコントロール、マスターページからLINKMETA要素を取得し、その内容を取得して、作業中のユーティリティでこれらのファイルに更新された値を書き戻す必要があります。

正規表現を使ってこれらの要素だけを取得しようとすることもできますが、そのアプローチにはいくつかの問題があります。

  • 私は、入力ファイルの多くに、壊れたHTML(欠落/順序外要素など)が含まれることを期待しています。
  • コメントやVBScript / JavaScriptを含むSCRIPT要素は、有効な要素などのように見えます。
  • 私はIEの条件付きコメントの中に特別なケースのIEの条件付きコメントとMETALINK要素を入れる必要があります
  • HTMLが通常の言語ではないことは言うまでもありません

私は.NETのHTMLパーサーのためのいくつかの調査を行いました。多くのSOの投稿とブログでは、 HTMLのAgility Packが推奨されています 。以前はこれまで使ったことがなかったし、壊れたHTMLやHTMLの断片を解析できるかどうかわからない。 (たとえば、 HTMLBODYないHEAD要素のみを含むユーザーコントロールを想像してみてください)私はドキュメントを読むことができると知っていますが、誰かがアドバイスできればかなり時間を節約できます。 (ほとんどのSO投稿には、完全なHTMLページの解析が含まれます)。

受け入れられた回答

絶対に、それはそれが優れているものです。

実際、野生で見つかる多くのWebページは、 <html>タグがないか、または不適切に閉じられたタグのために、HTMLフラグメントとして記述することができます。

HtmlAgilityPackは、ブラウザが何をしなければならないかをシミュレートしています。時には、不一致のタグが混じっていることから何かを理解しようとします。不完全な科学ですが、HtmlAgilgityPackはそれをとてもうまく行います。


人気のある回答

Html Agility Packの代わりに、C#のjQueryポートであるCsQueryを使用しています。これにより、CSSセレクタと完全なQuery APIを使用してDOMにアクセスして操作することができます。これは多くの人にとってXPATHより簡単です。さらに、HTMLパーサーはさまざまな目的を念頭に置いて設計されており、HTMLを解析するためのいくつかのオプションがあります:フルドキュメント( html, body欠落html, bodyタグの追加、ボディ内の孤立したコンテンツの移動)。 (つまり、完全な文書としてはラップされませんが、 tbodyなどのオプションのタグは、ブラウザでも同じように自動的に追加されます)、タグが存在しない真のフラグメントとして作成されたものです(たとえば、ビルディングブロックで作業している場合など)。

詳細については、新しいDOMの作成を参照してください。

さらに、CsQueryのHTMLパーサーは、オプションの終了タグのHTML5仕様を尊重するように設計されています。たとえば、 pタグを閉じることはオプションですが、ブロックをいつ閉じるべきかを決定する特定の規則があります。ブラウザーと同じDOMを生成するためには、パーサーは同じ規則を実装する必要があります。 CsQueryは、特定のソースに対してブラウザDOMとの高い互換性を提供するためにこれを行います。

CsQueryの使用は非常に簡単です。

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

最後に、CsQueryは、クラス、ID、属性、およびタグ作成セレクタのドキュメントを、Html Agility Packに比べて非常に高速に索引付けします。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ