Java HTML解析 〜Wikipedia 武器 ページの解析2〜

前回は、とりあえずでWikiのページ(武器)を取得する処理を実装しました。
これは、以下のような処理を行っています。

  1. 単純にURLで対象のHTMLのH2タグを取得
  2. 文字列でコンソールに表示

しかし、これでは意味がないので取得したいものを取得できるようにWikiページの構成を考えていきます。

Wikiページの中身

とりあえずは目次を取得することを考えます。
Wikiページの「目次」に関して、タグの属性に注目してみます。目次部分のHTMLをはじめの部分を抜き出してみました。

<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>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#武器のエネルギー"><span class="tocnumber">1</span> <span class="toctext">武器のエネルギー</span></a>
<ul>
<li class="toclevel-2 tocsection-2"><a href="#運動エネルギー"><span class="tocnumber">1.1</span> 

これの構成を見てみると大元(一番上)のタグのidとclassに注目してみると目次部分のHTMLにはID=「toc」とあります。
そしてその「toc」内に全ての内容が記載されているのでこれを取得すれば、目次部分が取得できます。

そして、以下のような構成で内容が記載されています。

<div id="toc" class="toc" /> => 全体のタグ
    「目次」
    toclevel-1 => トピックレベル1の項目
    toclevel-? => トピックレベル?の項目
       tocsection-? => 各セクション1〜?までの項目

なので、Javaのコードでは以下のような処理を行います。

  1. 「id=”toc"」のタグを取得
  2. それぞれの値をコンソールに出力

Jsoupを使用するとここら辺が簡単にできます。

Javaでの処理

public void execute() {
    // System.out.println("*** execute ***");
    String url = "https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8";
    Document doc = null;
    try {
        // Wikiページへアクセス、HTMLを取得する
        doc = Jsoup.connect(url).get();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // System.out.println("*** Get Content ***");
    Elements eles = doc.getElementById("toc").children();
    for (int i = 0; i < eles.size(); i++) {
        Element item = eles.get(i);
        printIndex(item, i);
    }
}

これは自分が作成したものですが、以下のような処理を行っています。

  1. 「id="toc"」のタグを取得
  2. タグの子供(タグ内にあるタグ)
    <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>
    <ul>
    <li class="toclevel-1 tocsection-1"><a href="#武器のエネルギー"><span class="tocnumber">1</span> <span class="toctext">武器のエネルギー</span></a>
    <ul>
    <li class="toclevel-2 tocsection-2"><a href="#運動エネルギー"><span class="tocnumber">1.1</span> <span class="toctext">運動エネルギー</span></a></li>

    上の「武器のエネルギー」などが含まれるタグを取得

  3. 取得したタグの文字列部分を取得

こんな感じの処理を行っています。

問題点

このままでは、取得したいタグの番号をつけている部分「1.1、2 ...」という数字があるので、混乱してしまいます。
本当であれば、これらは各項目のインデックスであり、項目の順番を示すものですので、これをちゃんと表示してやる必要があります。イメージとしては下のような感じです。

目次
1: 武器のエネルギー
1.1: 運動エネルギー
1.2: 人力
1.3: 火・燃焼
1.4: 生物(兵器)

これらの表示を行うために、頭をひねる必要があります。
これは次回にしようと思います。

でわでわ。。。

関連ページ

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などもやります。

コメントを残す