JavaRush /Java Blog /Random-JA /jsoup を使用した簡単な HTML 解析
Stanislav
レベル 21
Москва

jsoup を使用した簡単な HTML 解析

Random-JA グループに公開済み
おそらく、いつかアプリケーションで Web サイトや HTML ドキュメントから情報を取得する必要が生じるでしょう。その際、jsoup ライブラリを使用するとタスクが大幅に簡素化されることは、すぐに言っておきます。 wikiによると、jsoup は、HTML ドキュメントに格納されたデータを解析、抽出、操作するために設計されたオープン ソース Java ライブラリです。

ファストスタート

ライブラリは、jar ファイルとしてダウンロードしてプロジェクトに配置することも、Maven/Gradle を使用して接続することもできます。記事の最後に公式 Web サイトへのリンクを残しておきます。そこで、ライブラリの現在のバージョンを見つけることができます。この例では、Maven 経由の接続を使用します。依存関係を追加しましょう。
<​dependency​>
  <​groupId>org.jsoup</groupId>
  <​artifactId>jsoup</artifactId>
  <​version>1.11.3</version>
</dependency>

使用法

まず、Document解析用のソースを示すクラスのインスタンスを org.jsoup.nodes.Document から取得する必要があります。ローカル ファイルまたはリンクのいずれかにすることができます。たとえば、この記事では、Web サイト yandex.ru を使用して、最新のニュース フィードを取得してみます。
Document doc = Jsoup.connect("https://yandex.ru/")
                .userAgent("Chrome/4.0.249.0 Safari/532.5")
                .referrer("http://www.google.com")
                .get();
User Agentは、訪問中のサイトに伝達される識別子です。多くのサイトでは、これがスパム対策フィルターの最も重要な基準です。 Referrerリクエスト元のURLが含まれます。このメソッドはget()処理された IOException をスローするため、すべてをtry/catchブロックにラップすることも、 を使用してさらにスローすることもできますthrows。このページのソースコードを受け取りました。必要に応じて、jsoup ライブラリ自体が破損した要素を復元できます。あとは、検索範囲を別のブロックに絞り込むだけです。このメソッドにはselect()さまざまな用途があります。タグ、属性、クラス、その他のパラメーターによって要素を検索できます。最新のブラウザのほとんどは、選択した要素のソース コードを迅速に検索する機能をサポートしています。簡単な操作で、必要な要素のソース コードを見つけ、divサンプリングに使用する指定されたクラスのブロックを取得します。 jsoup を使用した簡単な HTML 解析 - 1org.jsoup.select.Elements のクラスを使用して、Elements選択したブロックからすべての要素を選択しましょう。
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
これで、次のようなものができました。 jsoup を使用した簡単な HTML 解析 - 2あとは、小さなループを使用してすべての要素を反復処理するだけです。
for (Element element : listNews.select("a"))
            System.out.println(element.text());
このメソッドをtext()使用すると、マークアップ コードを破棄し、すべての受信要素のテキストの組み合わせのみを残すことができます。実行の結果は次のようになります。 jsoup を使用した簡単な HTML 解析 - 3受信した実際の行数がページ上の実際の表示に対応していないことは簡単にわかります。ここに落とし穴があります。マークアップのソースコードを見ると、最新のニュースが一定の時間間隔でアニメーションのように変化していることがわかります。これらの「問題」の一部は、追加のサンプリング、そしてもちろんテストによって解決されます。最初の 5 つの要素には必要な情報が含まれ、6 番目の要素にはスクリプト化された空行のみが含まれることが判明する場合があります。また、ブロックに識別子がない場合もあり、その場合は、メソッドを使用してget(int index)問題の要素の位置番号を直接指定することができます。
System.out.println(listNews.select("a").get(2).text());

結論

この例は、jsoup の機能のほんの一部のみを示しています。また、サイトは頻繁に更新され、マークアップ コードの構造が変更されるため、スクレイピングを使用する場合は、変更に適応する準備ができている必要があります。詳細情報と現在のバージョンは公式 Web サイトjsoup.orgで入手でき、クラスとメソッドの詳細についてはo7planning.orgで読むことができます。私のgithubへのリンクを残しておきます。この記事の執筆時点では、情報の受信と表示に Jsoup を使用する Telegram ボットがいくつかあります。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION