Java Network 〜Javaでホームページにアクセスする仕組み〜

今回は、JavaでWebページにアクセスする処理を作るときの内容を記載します。

サンプルコードはGithubにアップしてあります。

1.ウェブにアクセス

プログラムでウェブにアクセスする部分に関して記載します。コードの説明になりますが。。。

System.out.println("*** execute ***");
String url = "https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8";
Document doc = null;
try {
    doc = Jsoup.connect(url).get();
} catch (IOException e) {
    e.printStackTrace();
}

変数の「url」にアクセスします。
処理の内容としては以下の通りです。

  1. アクセスするURLを指定します。つまり変数に代入します。
  2. そして、取得したHTMLをDocumentクラスに変換して取得します。doc = Jsoup.connect(url).get();
  3. 取得するときに例外(IOException)が出る可能性がある→メソッドの定義にthrows IOExceptionがある、のでtry chatchで囲む

2.HTMLの取得

これも同様に、コードから見ていきます。

Elements eles = doc.getElementById("toc").children();
for (int i = 0; i < eles.size(); i++) {
    Element item = eles.get(i);
    System.out.print("wholeText(): " + item.wholeText());
    System.out.println(" / text(): " + item.text());
    printIndex(item, i);
}

Jsoupのフレームワークを使うと言う部分になります。
ドキュメント(Document)クラスを中心にして取得します。

doc.getElementById("toc").children()

このコードでid="toc"と記述されたHTMLを取得します。
実際には[Wikiの「武器」ページ](https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8)から目次の部分を取得します。

具体例参照するぺーじのHTML
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/03/スクリーンショット-2020-03-23-20.49.38-300x192.png)

<div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"><div class="toctitle" lang="ja" dir="ltr"><h2 id="mw-toc-heading">目次</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>

目次のタグ部分です。はじめのタグ(一番外側のタグです)を取得しています。

よくJSで以下のような実装を行いますが、それと同じです。

var tag = document.getElementById("タグのID");

取得したタグからタグの中にある子供のタグを取得します。

## タグの取得
例えば、下のようなHTMLから。。。

<div class="toctitle" lang="ja" dir="ltr"><h2 id="mw-toc-heading">目次</h2><span class="toctogglespan">
    <label class="toctogglelabel" for="toctogglecheckbox"></label></span>
</div>

以下のようなコードを実行したとします。
```java
Document doc = Jsoup.connect(url).get();
// HTMLボディの取得
Element body = doc.body();
Elements eles = body.getElementById("toctitle");
eles.text();
```
と実装すると「目次」が取得できます。(間違ってたらごめんなさい。。。)大切なのは、子供のタグを取得(Elements)してElements#child()子供のタグを取得すると言うわけです。

## 結論から言うと
実装して動かしてみるのが一番ですが、サンプルコードとして。。。
```java
Element body = doc.body();
Elements eles = body.getElementsByTag("h2");
System.out.println("size: " + eles.size());
Elements eles = doc.getElementById("toc").children();
for (int i = 0; i < eles.size(); i++) {
Element item = eles.get(i);
System.out.print("wholeText(): " + item.wholeText());
System.out.println(" / text(): " + item.text());
printIndex(item, i);
}
```

## 関連ページ

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 9Training of for statement
  11. Java Basic Level 10 While statement 
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1
  17. Java Basic JUnit 〜テストスイートの作り方〜


投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す