ホームページ  >  記事  >  ウェブフロントエンド  >  Jsoup コード解釈 one-overview_html/css_WEB-ITnose

Jsoup コード解釈 one-overview_html/css_WEB-ITnose

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

今日、テキストを抽出するために Python で書かれたものを見つけました。喜んで Java で実装し、Webmagic に入れました。その後、それがすでに Jsoup に存在していることがわかりました。とても信頼できないと感じました。そんなことは忘れて、落ち着いて良いことを学びましょう!

Jsoup は、Java の世界での HTML 解析とフィルタリングに最適です。 HTML の DOM ツリーへの解析をサポートし、CSS セレクターのフォーム選択をサポートし、HTML フィルタリングをサポートし、HTTP ダウンローダーも付属しています。今日からJsoupのソースコード解釈シリーズを書いていきます。 前回のブログと比べて、より詳しく書いてみます。

概要

Jsoup のコードは非常に簡潔で、合計 53 のクラスがあり、SAXON の最終リリース パッケージ (980 万) と比較すると、非常に短くなります。簡潔。

jsoup

§── 例 #例。HTML をプレーン テキストに変換する例と、すべてのリンク アドレスを抽出する例が含まれます。

§── ヘルパー #データの読み取り、接続の処理、文字列変換のためのツールを含むいくつかのツールクラス

§── ノード #DOM ノードの定義

├── パーサー #HTML を解析して DOM ツリーに変換します

§── 安全性 #ホワイトリストや HTML フィルタリングを含む安全性関連

└── #Selector を選択、CSS セレクターと NodeVisitor 形式のトラバーサルをサポート

使用

Jsoup への入り口は Jsoup クラスです。サンプル パッケージには 2 つの例が用意されています。html を解析した後、CSS Selector と NodeVisitor を使用してそれぞれ Dom 要素を操作します。

Jsoup を呼び出す方法を示す ListLinks の例を次に示します。

public static void main(String[] args) throws IOException { Validate.isTrue(args.length == 1, "usage: supply url to fetch"); String url = args[0]; print("Fetching %s...", url);// 下载url并解析成html DOM结构 Document doc = Jsoup.connect(url).get(); // 使用select方法选择元素,参数是CSS Selector表达式 Elements links = doc.select("a[href]");print("\nLinks: (%d)", links.size()); for (Element link : links) { //使用abs:前缀取绝对url地址 print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35)); }}

Jsoup は独自の DOM コード システムのセットを使用しますが、ここでの要素、要素などの名前と概念は Java XML API 組織に似ています。 w3c.dom ですが、コードレベルでは関係がありません。つまり、XML の一連の API を使用して Jsoup の結果を操作したい場合、それは不可能ですが、このため、Jsoup は XML 内のいくつかの煩雑な API を放棄し、コードを簡素化できます。

もう 1 つの方法は、NodeVisitor を介して DOM ツリーをトラバースすることです。これは、HTML 全体を分析して置換する場合に便利です。

public interface NodeVisitor {//遍历到节点开始时,调用此方法 public void head(Node node, int depth);//遍历到节点结束时(所有子节点都已遍历完),调用此方法 public void tail(Node node, int depth);}HtmlToPlainText的例子说明了如何使用NodeVisitor来遍历DOM树,将html转化为纯文本,并将需要换行的标签替换为换行\n:public static void main(String... args) throws IOException { Validate.isTrue(args.length == 1, "usage: supply url to fetch"); String url = args[0];// fetch the specified URL and parse to a HTML DOM Document doc = Jsoup.connect(url).get();HtmlToPlainText formatter = new HtmlToPlainText(); String plainText = formatter.getPlainText(doc); System.out.println(plainText);}public String getPlainText(Element element) { //自定义一个NodeVisitor - FormattingVisitor FormattingVisitor formatter = new FormattingVisitor(); //使用NodeTraversor来装载FormattingVisitor NodeTraversor traversor = new NodeTraversor(formatter); //进行遍历 traversor.traverse(element); return formatter.toString();}

次のセクションでは、DOM 構造から始めて Jsoup コードを分析します。

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