【Javaクローラー】Jsoup

公式サイト
中国語マニュアル

jsoup.jar公式サイトダウンロード
jsoup.jar Baiduネットワークディスクダウンロード抽出コード:g6ek

jsoupはJava HTMLパーサーであり、主にHTMLの解析に使用され、URLアドレスとHTMLテキストコンテンツを直接解析できます。非常に省力化されたAPIを提供し、DOM、CSS、およびjQueryと同様の操作メソッドを通じてデータを取得および操作できます。

从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;

Jsoupのメインクラス


org.jsoup.Jsoup类

JsoupクラスはJsoupプログラムのエントリポイントであり、さまざまなソースからHTMLドキュメントをロードして解析するメソッドを提供します。Jsoupクラスのいくつかの重要なメソッドは次のとおりです。
ここに画像の説明を挿入


org.jsoup.nodes.Document类:

このクラスは、Jsoupライブラリを介したHTMLドキュメントのロードを表しますこのクラスを使用して、HTMLドキュメント全体に適用される操作を実行できます。Documentクラスの重要なメソッドについては、 http : //jsoup.org/apidocs/org/jsoup/nodes/Document.htmlを参照してください。Documentクラスの一般的なメソッドは次のとおりです。
ここに画像の説明を挿入

org.jsoup.nodes.Element类:

HTML要素は、タグ名、属性、子ノードで構成されますElementクラスを使用してデータを抽出します。ノードをトラバースし、HTMLElementクラスを操作する重要なメソッドは http://jsoup.org/apidocs/org/jsoup/nodes/Element.htmlにあります。Elementクラスの一般的なメソッドは次のとおりです。
ここに画像の説明を挿入

準備オーケー

Jsoupプロジェクトを作成します。ディレクトリ構造は次のとおり
ここに画像の説明を挿入
です。jsoupのjarパッケージを追加するには、Baiduネットワークディスクに配置します。バージョンは次のとおりです。jsoup-1.11.3

コンテンツケースのクロール


Webコンテンツのクロール

URLからドキュメントを読み込み、Jsoup.connect()メソッドを使用してURLから読み込みます

クロールされるページ情報は次のとおりです。
ここに画像の説明を挿入


コードは次のとおりです。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

/**
 * 获取 http://www.ygdy8.net/html/gndy/index.html 页面的“国内电影下载排行“
 */
public class JsoupDemo {
    
    
    public static void main(String[] args) {
    
    
        //URLLoader 是一个静态方法,可以通过类名直接调用
        JsoupDemo.URLLoader("http://www.ygdy8.net/html/gndy/index.html");
    }

    public static void URLLoader(String url){
    
    
        Document d1;

        try {
    
    
            //通过Jsoup类中的静态方法connect返回Document对象,该document对象实际为整个html页面内容。
            d1 = Jsoup.connect(url).get();
            System.out.println("网页的标题是:" + d1.title() + "\n");

            /**
             * 1. 分析网页结构,发现我们想要的国内电影下载排行榜,所对应的class样式为co_content2,
             * 2. 可以通过属性、后代选择器选中元素" div[class=‘co_content2’] ul a" ,然
             * 3. 后通过Element类中的text()方法获取文本内容
             */
            Elements es = d1.select("div[class='co_content2'] ul a");

            //遍历得到的结果并输出内容
            for (Element e : es){
    
    
                System.out.println(e.text());
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

ドキュメントコンテンツのクロール

ファイルからドキュメントを読み込み、Jsoup.parse()メソッドを使用してファイルからHTMLを読み込みます

クロールされるページは次のとおりです。これは、ローカルパスのHTMLドキュメントです
ここに画像の説明を挿入

コードは次のとおりです。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;

/**
 * 从本地文件加载文档,获取淘宝主营区域包括哪些方面 文件路径为: C:\Users\vsue\Desktop\taobao.html
 */
public class JsoupDocDemo {
    
    
    public static void main(String[] args) {
    
    
        JsoupDocDemo.LocLoader("C:\\Users\\vsue\\Desktop\\taobao.html");
    }

    public static void LocLoader(String address) {
    
    
        Document d2;
        try {
    
    
            //从文件加载文档,使用`Jsoup.parse()`方法从文件加载HTML
            d2 = Jsoup.parse(new File(address), "utf-8");
            System.out.println(d2.title());

            Elements es = d2.select("ul[class='service-bd'] li a");

            for (Element e : es){
    
    
                System.out.println(e.text());
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

    }
}

結果は次のとおりです。
ここに画像の説明を挿入


文字列のコンテンツをクロールする

文字列からドキュメントを読み込み、Jsoup.parse()メソッドを使用して文字列からHTMLを読み込みます

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupStrDemo {
    
    
    public static void main(String[] args) {
    
    
        String html = "<html>"
                + "<head>"
                + "<title>First parse</title>"
                + "</head>"
                + "<body>"
                + "<p>Parsed HTML into a doc.</p>"
                + "<a href='http://www.baidu.com'>百度一下</a>"
                + "</body>"
                + "</html>";
        JsoupStrDemo.StringLoader(html);
    }
    public static void StringLoader(String html){
    
    
        //从String加载文档,使用Jsoup.parse()方法从字符串加载HTML
        Document d3 = Jsoup.parse(html);
        String url = d3.select("a").attr("href");
        System.out.println(d3.title()+"    "+url);
    }
}

結果:
ここに画像の説明を挿入

ページ上のすべてのリンクを取得する

多くの場合、ページには多数のURLが含まれ、さまざまなインターフェースにジャンプし、JingdongのメインページのすべてのURLを取得するメソッドを定義します

ページ<a>内のすべてのタグをクロールし、トラバースします

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

/**
 * 获取HTML页面中的所有链接
 */
public class JsoupAllUrlDemo {
    
    
    public static void main(String[] args) {
    
    
        JsoupAllUrlDemo.allUrlLoader("https://www.jd.com/");
    }
    public static void allUrlLoader(String address){
    
    

        Document d4;
        try {
    
    
            d4 = Jsoup.connect(address).get();

            //links包含了页面所有的连接
            Elements links = d4.select("a[href]");
            for (Element link : links) {
    
    
                System.out.println("text : " + link.text()+"---》link : " + link.attr("href"));
            }
        } catch (IOException e) {
    
    
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

ボディフラグメントを解析する

メソッド
Jsoup.parseBodyFragment(String html)メソッドを使用します。

String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();

description
parseBodyFragmentメソッドは空のドキュメントを作成し、解析されたHTMLをbody要素に挿入します。通常のJsoup.parse(String html)方法を使用している場合、通常は同じ結果が得られますが、ユーザーがbodyセグメントとして明示的に入力することにより、ユーザーによって提供された不良HTMLがbody要素に解決されるようにします。

Document.body()このメソッドは、ドキュメントボディ要素のすべての子要素を達成できdoc.getElementsByTag("body")ます。

データ抽出

ドキュメントを走査するDOMメソッド

HTMLを解析してドキュメントにした後、DOMと同様のメソッドを使用して操作できます。サンプルコード:
ここに画像の説明を挿入


Elementsオブジェクトは、DOMに似た一連のメソッドを提供して、要素を検索し、データを抽出して処理することを説明します。詳細は次のとおりです。

要素を検索

  • getElementById(String id)
  • getElementsByTag(文字列タグ)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key)(および関連するメソッド)
  • 要素の兄弟:siblingElements()、firstElementSibling()、lastElementSibling(); nextElementSibling()、previousElementSibling()
  • グラフ:parent()、children()、child(int index)

要素データ

  • attr(String key)属性を取得attr(String key、String value)set attributes
    attributes()すべての属性を取得
  • id()、className()およびclassNames()
  • text()テキストの内容を取得text(String value)テキストの内容を設定
  • html()要素内のHTMLを取得しますhtml(文字列値)要素内のHTMLコンテンツを設定します
  • outerHtml()要素の外側のHTMLコンテンツを取得します
  • data()データコンテンツを取得します(例:スクリプトおよびスタイルタグ)
  • tag()およびtagName()

HTMLとテキストを操作する

  • append(String html)、prepend(String html)
  • appendText(String text)、prependText(String text)
  • appendElement(String tagName)、prependElement(String tagName)
  • html(文字列値)

セレクター構文を使用して要素を検索する

メソッド
を使用してElement.select(String selector)Elements.select(String selector)操作要素を見つけて実装することができます

ここに画像の説明を挿入

jsoup要素オブジェクトは、CSS(またはjquery)と同様のセレクター構文をサポートし、非常に強力で柔軟な検索機能を実現します。

この選択メソッドDocumentElement、またはElementsオブジェクトで使用できます。また、状況依存であるため、指定された要素のフィルタリングやチェーン選択アクセスを実現できます。

selectこのメソッドはElementsコレクションを返し、結果を抽出して処理するための一連のメソッドを提供します。


セレクターの概要

  • tagname:次のようなタグで要素を検索します。a
  • ns|tag:ラベルを介して名前空間内の要素を検索します。例:<fb:name>要素にfb | name構文を使用できます
  • #id:次のようなIDで要素を検索します。#logo
  • .class:次のようなクラス名で要素を検索します。.masthead
  • [attribute]:属性を使用して、次のような要素を検索します。[href]
  • [^attr]:属性名の接頭辞を使用[^data-]して要素を検索します。例:HTML5データセット属性を持つ要素を検索するために使用できます
  • [attr=value]:属性値を使用して、次のような要素を検索します。[width=500]
  • [attr^=value], [attr$=value], [attr*=value]:次のような要素を見つけるには、最初、最後、または含まれている属性値に一致する属性値を使用します。[href*=/path/]
  • [attr~=regex]:属性値を使用して正規表現と一致させ、次のような要素を検索します: img[src~=(?i)\.(png|jpe?g)]
  • *:この記号はすべての要素に一致します

セレクターセレクター併用

  • el#id:要素+ ID、例:div#logo
  • el.class:要素+クラス、例:div.masthead
  • el[attr]:要素+クラス、例:a [href]
  • 任意组合、など:a [href] .highlight
  • ancestor child:要素の子要素を検索します。例:.body pを使用して、「body」要素の下にあるすべてのp要素を検索できます
  • parent > child:親要素の下で直接の子要素を検索します。例:div.content> pを使用してp要素を検索するか、body> *を使用してbodyタグの下ですべての直接の子要素を検索できます
  • siblingA + siblingB:A要素の前にある最初の兄弟要素Bを見つけます。例:div.head + div
  • siblingA ~ siblingX:A要素の前に同じレベルのX要素を見つけます。例:h1〜p
  • el, el, el:複数のセレクターの組み合わせ。たとえば、div.masthead、div.logoのように、任意のセレクターに一致する唯一の要素を見つけます。

疑似セレクターselectors

  • :lt(n):要素の兄弟インデックス値(DOMツリーでのその位置は、その親ノードに対して相対的です)がn未満であることを確認します。例:td:lt(3)は、3列未満の要素を意味します
  • :gt(n):nより大きい同じインデックス値を持つ要素を見つけます。例:div p:gt(2)は、2を超えるp要素を含むdivを示します
  • :eq(n):nと同じインデックス値を持つ要素を見つけます。例:form input:eq(1)は、inputタグを含むForm要素を意味します
  • :has(seletor):セレクターに含まれる要素と一致する要素を検索します。例:div:has§は、どのdivがp要素を含むかを示します
  • :not(selector):セレクターと一致しない要素を検索します。例:div:not(.logo)は、class = logo要素を含まないすべてのdivのリストを意味します
  • :contains(text):指定されたテキストを含む要素を検索します。検索では大文字と小文字が区別されません。例:p:contains(jsoup)
  • :containsOwn(text):指定されたテキストを直接含む要素を検索します
  • :matches(regex):div:matches((?i)login)など、指定した正規表現に一致するテキストの要素を検索します
  • :matchesOwn(regex):指定された正規表現に一致するテキストを含む要素を検索します

注:上記の疑似セレクタインデックスは0から始まります。つまり、最初の要素のインデックス値は0、2番目の要素のインデックスは1など
です詳細についてはセレクタ APIリファレンスを確認してください。



要素から属性、テキスト、HTMLを抽出する

解析してDocumentインスタンスオブジェクトを取得し、いくつかの要素を見つけたら、これらの要素のデータを取得します。

方法

  • 属性の値を取得するには、Node.attr(String key)メソッドを使用できます
  • 要素内のテキストについては、Element.text()メソッドを使用できます
  • HTMLコンテンツの要素または属性にアクセスするにはElement.html()、またはNode.outerHtml()メソッドを使用できます
    ここに画像の説明を挿入

上記のメソッドは、要素データアクセスのコアメソッドです。さらに、他のいくつかの方法を使用できます。

  • Element.id()
  • Element.tagName()
  • Element.className()また、Element.hasClass(String className)
    これらのアクセサメソッドには、データを変更するための対応するセッターメソッドがあります。


データを変更する

問題

在你解析一个Document之后可能想修改其中的某些属性值,
然后再保存到磁盘或都输出到前台页面。

メソッドの
プロパティの設定方法を使用することができElement.attr(String key, String value)、そしてElements.attr(String key, String value)

要素のクラス属性を変更する必要がある場合はElement.addClass(String className)Element.removeClass(String className)メソッドメソッドを使用できます

Elementsには、要素の属性とクラスをバッチで操作するためのメソッドが用意されています。たとえば、div内の各a要素にrel = "nofollow"を追加するには、次のメソッドを使用できます。

doc.select("div.comments a").attr("rel", "nofollow");

説明
要素内の他の方法等は、ATTR方法は、要素を返す(又はセレクタを使用した場合の要素コレクションを返します)これは、書く方法を使用するのに非常に便利です。といった:

doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");


要素のHTMLコンテンツを設定する

ここに画像の説明を挿入
説明

  • Element.html(String html) このメソッドは最初に要素のHTMLコンテンツをクリアし、次に渡されたHTMLで置き換えます。
  • Element.prepend(String first)また、Element.append(String last)HTMLの内部要素の前後にそれぞれHTMLコンテンツを追加する方法
  • Element.wrap(String around) 要素に外部HTMLコンテンツをラップします。

要素のテキストコンテンツを設定する

メソッド
Elementの設定メソッドを使用して、HTMLドキュメントのテキストコンテンツを変更できます。
ここに画像の説明を挿入


テキスト設定メソッドは、HTMLセッターメソッドと同じです。

  • Element.text(String text) 要素の内部HTMLコンテンツをクリアし、提供されたテキストを置き換えます
  • Element.prepend(String first)またElement.append(String last)、ノードはhtml要素内のテキストの前後に追加されます。

受信テキストに<、>などの文字が含まれている場合、HTMLではなくテキストとして処理されます。

おすすめ

転載: blog.csdn.net/weixin_45468845/article/details/108563904