ホームページ >ウェブフロントエンド >htmlチュートリアル >Atitit.html パーサーの選択?jsoup?nsoup?,java?c#?.net?version_html/css_WEB-ITnose

Atitit.html パーサーの選択?jsoup?nsoup?,java?c#?.net?version_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:38:161023ブラウズ

Atitit.html パーサーの選択 jsoup nsoup、Java C# .net バージョン

1. フレームワーク選択の要件 1

1.1. その他のドキュメント 1

1.2。

2 . HTMLパーサー機能: 1

2.1. jQuery スタイルの CSS セレクター 1

2. HTML ドキュメントの操作1

3. ブラウザーの HTML 解析の原理 2

4.ヘッド領域 4

5. HTML パーサー 4

6. 参考資料 8

6.1.1. atitit.java?jsoup?html のコラム...8

1. フレームワークの要件選択

1.1. 豊富なドキュメント

1.2. クロスプラットフォーム

2. HTML パーサーの機能:

2.1. 信頼できないソースからの HTML のクリーンアップ

2.2.

· jQuery スタイル CSS セレクター

NSoup.Nodes.Document doc = NSoup.NSoupClient.Parse(HtmlString);

?

NSo up.Nodes.Document doc = NSoup .NSoupClient.Connect("http://www. oschina.net/").Get();

?

ebClient webClient =?new WebClient();

String HtmlString=Encoding.GetEncoding("utf-8 ").GetString(webClient.DownloadData("http: //www.oschina.net/"));

NSoup.Nodes.Document doc = NSoup.NSoupClient.Parse(HtmlString);

?

WebRequest webRequest= WebRequest.Create("http://www.oschina .net/");

NSoup.Nodes.Document doc = NSoup.NSoupClient.Parse(webRequest.GetResponse().GetResponseStream(),"utf-8");

作者:: ラオワの爪 Attilax Ailong, EMAIL:1466519819@qq.com

3. ブラウザが HTML を解析して文字化けを防ぐ原理

詳細

HTML 文書は、文字エンコーディング情報を持つ文字としてインターネット上で送信される一連のバイト ストリームです。文字エンコード情報は、ドキュメントとともに送信される HTTP 応答ヘッダー、またはドキュメントの HTML タグで指定できます。ブラウザは、文字エンコーディング情報に基づいて、バイトストリームをブラウザ上で表示される文字に変換します。ページの文字を構築する方法がわからない場合、ブラウザは当然のことながらページを正しくレンダリングできません。ほとんどのブラウザは、JavaScript コードの実行またはページの描画を開始する前に、一定量のバイト ストリームをバッファリングします。また、バッファリング中に、関連する文字エンコーディング設定を検索する必要があります (注目すべき例外は IE6/7/8 です)。

ブラウザごとにバッファに必要なバイト ストリームの量も異なります。また、エンコード設定が見つからない場合、各ブラウザのデフォルトのエンコードも異なります。ただし、どのブラウザーであっても、十分なバイト ストリームをバッファリングしてページのレンダリングを開始した後、指定されたエンコード設定がデフォルト値と異なることが判明した場合、ドキュメントが再解析され、ページが再描画されます。エンコーディングの変更が外部リソース (cssjsmedia など) に影響を与える場合、ブラウザーはリソースを再リクエストすることもあります。

これらの遅延を回避するには、1k (正確には 1024 バイト。これはテストしたすべてのブラウザの最大バッファリング制限です) を超える HTML ドキュメントに対してできるだけ早く文字エンコーディングを指定します。

推奨事項

HTTP ヘッダー情報またはメタ タグを通じてエンコードを指定します

HTML ドキュメントのエンコード設定を指定するには、いくつかの方法があります:

サーバー側: すべての text/html タイプに対して、Web サーバーの構成を通じてエンコード パラメーターを指定します。ドキュメントでは、正しいエンコード情報を含む Content-Type ヘッダーが指定されています。例: Content-Type: text/html;charset=UTF-8

クライアント: HTML コードにメタ タグ http-equiv="content-type" を含めて、文字エンコーディングを指定します。例えば ​​。

可能であれば、WebサーバーのHTTPヘッダー情報で文字エンコードを指定するように設定してください。一部のブラウザ (Firefox など) は、(他のブラウザよりも) 短い遅延バッファを使用して、JavaScript を実行する前にヘッダーで文字エンコーディングが指定されているかどうかを確認します。これは、HTML タグのチェックをスキップし、バッファリングのバイト数と遅延を短縮できることを意味します

4. ヘッド領域の先頭にメタ タグを配置します

Web サーバーの設定を変更できない場合は、メタ タグを介してエンコーディングを指定する必要があります、エンコーディングの指定に使用するメタ タグがドキュメント内の head タグの最初の子要素であることを確認してください。ブラウザはドキュメントの最初の 1024 バイトで文字エンコード パラメータを検索するため、パフォーマンスの低下を避けるために、エンコード パラメータがドキュメント ヘッダーに早く現れるほど良いです (注釈: IE6 より前のバージョンでは、特定の状況下では、メタタグが head の最初の子要素でない場合、無視されます

5. HTML パーサー

HTML パーサーの仕事は、HTML タグを解析して解析ツリーにすることです。

5.0.1.1. HTML 構文の定義

HTML の語彙と構文は、w3c 組織によって作成された仕様で定義されています。現在のバージョンは HTML4 ですが、HTML5 の作業が進行中です。

5.0.1.2. 文脈自由文法ではありません

パーサーの紹介で見られるように、文法は BNF に似た形式で規範的に定義できます。残念ながら、通常のパーサーに関する議論はすべて HTML には当てはまりません (冗談で言及しているわけではありません。これらのパーサーは CSS と JavaScript の解析に使用できます)。 HTML は、パーサーに必要なコンテキストフリー構文で定義できません。従来、HTML 形式の仕様は DTD (Document Type Definition) によって定義されていましたが、それは文脈自由文法ではありませんでした。

HTML は XML に非常に近いです。 XML に使用できるパーサーは多数あります。 HTML には XHTML と呼ばれる XML バリアントもありますが、それらの主な違いは何でしょうか?違いは、HTML アプリケーションはより「寛容」で、一部の開始タグや終了タグ​​などを見逃してもよいことです。これは全体として「ソフト」な構文であり、XML ほど厳密で厳格ではありません。全体として、この一見微妙な違いが 2 つの異なる世界を生み出します。一方で、HTML が人気を博しているのは、間違いが許容され、Web ページ作成者としての作業が容易になるためです。その一方で、文法的な形式を書くのが難しくなります。要約すると、HTML 解析は単純ではありません。既製のコンテキスト依存パーサーはそれを処理できず、XML パーサーも同様です。

5.0.1.3. 解析アルゴリズム

前に見たように、HTML はトップダウンまたはボトムアップのパーサーを使用して解析することはできません。

その理由は次のとおりです:

1. 言語の耐性特性

2. ブラウザーは無効な HTML に対するフォールト トレランスを提供する必要があるという事実。

3. 分析プロセスを繰り返します。通常、ソース コードは解析プロセス中に変更されません。しかし、HTML では、script タグに「document.write」が含まれている場合にコンテンツを追加できます。つまり、解析プロセスによって実際にソース コードが変更されます。

ブラウザは、HTML ドキュメントを解析するための独自のパーサーを作成します。

HTML5 仕様には、解析アルゴリズムに関する具体的な指示があり、単語の分割とツリーの構築という 2 つの部分で構成されます。

単語のセグメンテーションは字句解析部分に属し、入力を一連の記号に解析します。 HTML における記号は、開始タグ、終了タグ、属性名、属性値です。

トークナイザーはこれらのシンボルを認識し、ツリー ビルダーに入力し、入力が終了するまで次のシンボルの分析と処理を続けます

5.0.1.4. 単語分割アルゴリズム

アルゴリズムの出力は HTML シンボルです。アルゴリズムはステート マシンを使用して記述できます。各状態は入力ストリームから 1 つ以上の文字を消費し、それらに基づいて次の状態を更新します。決定は、現在のシンボルの状態とツリーの構築状態に影響されます。これは、同じ文字でも現在の状態に応じて異なる結果が生じる可能性があることを意味します。アルゴリズムは複雑すぎるため、例を使用してその仕組みを見てみましょう。

以下のタグを分析します:

Hello world

「<」が発生したときの初期状態は「データ状態」です。ステータスが「タグオープン状態」に変わります。 「a-z」の文字で構成されたシンボルを食べると「開始タグトークン」が生成され、「タグ名状態」に状態が変化します。 「>」に遭遇するまでこの状態が続きます。各文字が新しいシンボル名に追加されます。この例では、解決されたシンボルは「html」です。

「>」に遭遇すると、現在のシンボルが完了し、状態が「データ状態」に戻ります。 「」タグも同様に扱われます。 「html」タグと「body」タグが完成したので、「データ状態」の状態に戻ります。 「H」(「Hello world」の頭文字)を食べると文字記号が生成され、「」の記号に遭遇するまで、「Hello world」という文字記号が完成しました。 「。」

これで「タグオープン状態」の状態に戻りました。次の入力「/」を食べると「終了タグトークン」が生成され、「タグ名状態」状態に遷移します。繰り返しますが、この状態は「>」を押すまで残ります。この時点で、新しいラベル シンボルが完成し、「データ状態」に戻ります。同様に「」もこのように処理されます。

5.0.1.5. ツリー構築アルゴリズム

パーサーが作成されると、ドキュメント オブジェクトも作成されます。ツリー構築プロセス中に、DOM ツリーのルート ノード (ドキュメント) が変更され、要素がそれに追加されます。トークナイザーによって完成された各ノードは、ツリー ビルダーによって処理されます。この仕様では、各シンボルがどの DOM オブジェクトに関連付けられるかを定義します。要素は DOM ツリーに追加されるだけでなく、開いている要素のスタックにも追加されます。このスタックは、ネスト エラーとタグが閉じられていないエラーを修正するために使用されます。このアルゴリズムもステート マシンによって記述され、その状態は「挿入モード」と呼ばれます。

以下の入力に対するツリー構築プロセスを見てみましょう:

Hello world

ツリー構築プロセスでは、入力は単語分割プロセス中に取得されたシンボル シーケンスです。最初のモードを「初期モード」と呼びます。 HTML シンボルを受信した後、「before HTML」モードに変更され、このモードでシンボルが再処理されます。これにより、HTMLHtmlElement 要素が作成され、ルート ドキュメント ノードに追加されます。

するとステータスが「頭前」に変わります。 「body」を受け取ると、HTMLHeadElement が暗黙的に作成され、タグがない場合でも作成されてツリーに追加されます。

ここで、「in head」モードに入り、次に「after head」に入り、Body が再処理され、HTMLBodyElement 要素が作成および挿入されてから、「in body」モードに入ります。

文字シンボル「Hello world」を受け取った後、「Text」ノードが作成され、すべての文字が 1 つずつ追加されます。

body終了タグを受け取った後は「after body」モードに入り、html終了タグを受け取った後は「after after body」モードに入ります。すべてのシンボルが処理された後、解析は終了します

6.

atitit.jsoup html テーブルの読み取りと解析の概要

6.0.1. atitit.java?jsoup?html テーブルの読み取り解析の概要 - ?attilax のコラムを参照してください。 ..

使いやすい収集および解析ツール_HTML 解析ツール HtmlAgilityPack_Phoenix Nirvana_Sina Blog.html

ブラウザはどのように解析するのか HTML_IT 知識の質問と回答_Xisai.html

ブラウザはどのように動作するか: レンダリング エンジン、HTML 解析 (シリアル 2) ) ? Ctrip Design Committee.html

HTML解析ツール HtmlAgilityPack - Zhou Gong (Zhou Jinqiao) のコラム - 51CTO Technology Blog.html

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。