前回は、とりあえずでWikiのページ(武器)を取得する処理を実装しました。
これは、以下のような処理を行っています。
- 単純にURLで対象のHTMLのH2タグを取得
- 文字列でコンソールに表示
しかし、これでは意味がないので取得したいものを取得できるように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のコードでは以下のような処理を行います。
- 「id=”toc"」のタグを取得
- それぞれの値をコンソールに出力
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); } }
これは自分が作成したものですが、以下のような処理を行っています。
- 「id="toc"」のタグを取得
- タグの子供(タグ内にあるタグ)
<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>
上の「武器のエネルギー」などが含まれるタグを取得
- 取得したタグの文字列部分を取得
こんな感じの処理を行っています。
問題点
このままでは、取得したいタグの番号をつけている部分「1.1、2 ...」という数字があるので、混乱してしまいます。
本当であれば、これらは各項目のインデックスであり、項目の順番を示すものですので、これをちゃんと表示してやる必要があります。イメージとしては下のような感じです。
目次 1: 武器のエネルギー 1.1: 運動エネルギー 1.2: 人力 1.3: 火・燃焼 1.4: 生物(兵器)
これらの表示を行うために、頭をひねる必要があります。
これは次回にしようと思います。
でわでわ。。。
関連ページ
Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜