ホームページ  >  記事  >  ウェブフロントエンド  >  Jsoup コード解釈パート 7 - CSS Selector_html/css_WEB-ITnose の実装

Jsoup コード解釈パート 7 - CSS Selector_html/css_WEB-ITnose の実装

WBOY
WBOYオリジナル
2016-06-21 08:56:591087ブラウズ

ダンダンダン!最後に、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

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