Jsoup コード解釈パート 7 - CSS Selector_html/css_WEB-ITnose の実装
ダンダンダン!最後に、Jsoup の機能である CSS セレクターの部分に来ます。 Selector は、私が作成したクローラー フレームワークである Webmagic の開発の焦点でもあります。ストリートファイターの写真を添付しました。将来、Webmagic が Jsoup に挑戦できることを願っています。
select メカニズム
Jsoup の select パッケージのクラス構造は次のとおりです:
Jsoup を初めて紹介したとき、NodeVisitor と Selector についてはすでに言及しました。 Selector は選択部分の外部ファサードであり、NodeVisitor はツリーを走査するための基礎となる API です。CSS Selector も NodeVisitor に基づいて走査されます。
Jsoup 選択の中核は Evaluator です。 Selector によって渡された式は QueryParser を通過し、最終的に Evaluator にコンパイルされます。 Evaluator は、メソッドが 1 つだけある抽象クラスです:
public abstract boolean matches(Element root, Element element);
ここではルートが渡され、場合によってはツリーをトラバースするために使用されることに注意してください。
エバリュエーターの設計は簡潔かつ明確であり、すべてのセレクター表現ワードが対応するエバリュエーターにコンパイルされます。たとえば、#xx は Id、.xx はクラス、[] は属性に対応します。これは、w3c の CSS セレクター仕様の補足です: http://www.w3.org/TR/CSS2/selector.html
もちろん、Jsoup は、これらだけでは十分ではありません (Evaluator Perform 用)。 And/Or の組み合わせ)、StructuralEvaluator (スクリーニング用の DOM ツリー構造と組み合わせます)。
ここで最も懸念されるのは、「div ul li」のような親子構造を実装する方法です。これの実装は StructuralEvaluator.Parent にあります。コードを貼り付けます:
static class Parent extends StructuralEvaluator { public Parent(Evaluator evaluator) { this.evaluator = evaluator; }public boolean matches(Element root, Element element) { if (root == element) return false;Element parent = element.parent(); while (parent != root) { if (evaluator.matches(root, parent)) return true; parent = parent.parent(); } return false; }}
ここに Parent にはエバリュエーター属性が含まれており、すべての親ノードはこのエバリュエーターに基づいて検証されます。 Parent はネストできるため、式 "div ul li" は最終的に And(Parent(And(Parent(Tag("div")), Tag("ul")),Tag("li" ) にコンパイルされることに注意してください。 )) このような評価者の組み合わせ。
選択部分は想像よりシンプルで、コードも非常に読みやすいです。パーサー部分を学習した後は、この部分はよく理解できるはずです。
webmagic の今後の計画について
webmagic は、HTML で指定されたテキストを取得するために使用されるクローラ フレームワークです。そのメカニズムは、webmagic を除いて Jsoup の Evaluator と非常によく似ています。一時的にセレクターはより単純な API にカプセル化されますが、エバリュエーターは式を直接追加します。以前、DSL をカスタマイズして HTML を作成することを検討しましたが、Jsoup のソース コードを確認すると、それを実装できることがわかりました。書きやすくて分かりやすいのが難点です。
実際、Jsoup のソース コードを確認すると、基本的に、各クラスが実際の概念的な抽象化に対応していることがわかります。
次の記事では、最後の部分であるホワイトリストと HTML フィルタリング メカニズムについて説明します。
最後に、この一連の記事とコードの github アドレスはまだ添付されています: https://github.com/code4craft/jsoup-learning

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









この記事では、HTML< Progress>について説明します。要素、その目的、スタイリング、および< meter>との違い要素。主な焦点は、< Progress>を使用することです。タスクの完了と< Meter> statiの場合

この記事では、HTML< Datalist>について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

この記事では、html< meter>について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化< Meter> < Progress>およびex

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

この記事では、< iframe>外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する
