表示テキストからの抽出は不正確であるため、HTMLソースからデータを抽出します。
上記のHTMLソースを調べると下記のようになっています。
----------------------------------------------
テーブル名:id=table01 ← IEタグ解析ツールで容易に調査可
それぞれの項目−1番目ロシア
<td class="rank"><span class="rank_area rank1">1位</span></td>
<td class="name tap">
<span class="flag_mini sprite-RU_mini"></span> <a href="http://ecodb.net/country/RU/">ロシア</a>
</td>
<td class="value">17,070,000.00<br><span class="bar_chart" style="width: 100px;"></span></td>
<td class="rank_prev tap">
<span class="rank_none">n/a</span>
</td>
<td class="ctype">国</td>
<td class="area">ヨーロッパ</td>
よって、ここでは、下記のように正規表現を設定します。
正規表現の書式については右記を参照 − 正規表現の書式
順位 | |
<span class=\x22rank_area rank\d+\x22>(\d+?)位</span> | |
(\d+?) 数字が1個以上連続する部分を抽出 | |
国旗へのリンク、国名称 | |
href=\x22(.+?)\x22>(\D+?)< | |
(.+?) アドレス部分は1個以上の任意の文字列 | |
(\D+?) 国名は数字以外の1個以上の任意の文字列 | |
面積 | |
(?:class=\x22value\x22>)?([\d\,\.]+?)< | |
([\d\,\.]+?) 数字、カンマ、ピリオドのどれかが1個以上連続 |
それぞれの項目の間には任意の文字(改行を含む)が存在するので、
<span class=\x22rank_area rank\d+\x22>(\d+?)位</span>(?:.|\n)+?href=\x22*(.+?)\x22*>(\D+?)<(?:.|\n)+?(?:class=\x22value\x22>)?([\d\,\.]+?)<
となります。
(\d+)? 1個以上の数字の最短マッチ
(\D+)? 1個以上の数字以外の最短マッチ
([\d\,\.]+)? 数字、カンマ、ピリオドのいずれかが1個以上の最短マッチ
?: キャッチアップ(抽出対象)としないことを意味する
(?:.\n)? 改行を含む任意の最短マッチ文字−キャッチアップ(抽出対象)しない
(?:class=\x22value\x22>)?
class="value"> の文字で最短マッチ−キャッチアップ(抽出対象)しない
\x22 「"」ダブルクォートを表すASCIIコード、「"」と直接記述すると文字列全体を囲む「"」と混同してしまうため。
正規表現の全体としては、
上記の赤文字(カッコ内)の部分が抽出する項目
それぞれ、見つかった順に、変数 %$1% , %$2% , %$3% , %$4% に格納されます。
-----------------------------------
文字列の整形表示について
%adrs_list%
formatb(%rank%,"@@@") formatb(%nation%,"!@@@@@@@@@@@@@@@@@@") formatb(%value%,"@@@@@@@@@@@@@") %link_flag%
formatb 関数を使用して、半角換算の文字数に揃うようにしています。
formatb(Expression,"@@@@@@@@@@")
半角換算10文字になるように前に半角空白を詰める。
!@@@@@@@@@@ とすると、左詰め(後部に半角空白)となる。
------------------------------------
コードの使用方法
ソースを表示してみます。
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<title>世界の面積ランキング - 世界経済のネタ帳</title>
<meta property="og:title" content="世界の面積ランキング - 世界経済のネタ帳" />
<meta property="og:type" content="website" />
<meta property="og:url" content="http://ecodb.net/ranking/area.html" />
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
<table id='table01' class='tablesorter'>
<thead>
<tr>
<th class='rank'>順位<br /></th>
<th class='name'>国名称</th>
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
<tbody>
<tr id='RU_'>
<td class='rank'><span class='rank_area rank1'>1位</span></td>
<td class='name tap'>
<span class='flag_mini sprite-RU_mini'></span> <a href='http://ecodb.net/country/RU/'>ロシア</a>
</td>
<td class='value'>17,070,000.00<br /><span class='bar_chart' style='width:100px;'></span></td>
<td class='rank_prev tap'>
<span class='rank_none'>n/a</span>
</td>
<td class='ctype'>国</td>
<td class='area'>ヨーロッパ</td>
</tr>
<tr id='CA_'>
<td class='rank'><span class='rank_area rank2'>2位</span></td>
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
<tr id='VA_'>
<td class='rank'><span class='rank_area rank201'>201位</span></td>
<td class='name tap'>
<span class='flag_mini sprite-VA_mini'></span> <a href='http://ecodb.net/country/VA/'>バチカン</a>
</td>
<td class='value'>0.44<br /><span class='bar_chart' style='width:0px;'></span></td>
<td class='rank_prev tap'>
<span class='rank_none'>n/a</span>
</td>
<td class='ctype'>国</td>
<td class='area'>ヨーロッパ</td>
</tr>
</tbody>
</table>
IEを起動しない分、HTMLドキュメント取得は、かなり高速になります。
(ただし、正規表現による抽出時間は同じ。)
正規表現は下記のように設定します。
正規表現の書式については右記を参照 − 正規表現の書式
ほとんどは同じですが、ダブルクォート記号が、シングルクォートになっています。
よって、ここではコードではなく、そのまま「'」を記述しています。
テーブル部分 | |
(<table id='table01'.+>(?:.|\n)+?</table>) | |
順位 | |
<span class='rank_area rank\d+'>(\d+?)位</span> | |
(\d+?) 数字が1個以上連続する部分を抽出 | |
国旗へのリンク、国名称 | |
<a href='(.+?)'>(.*)</a> | |
(.+?) アドレス部分は1個以上の任意の文字列 | |
(\D+?) 国名は数字以外の1個以上の任意の文字列 | |
面積 | |
class='value'>([\d\,\.]+)?< | |
([\d\,\.]+)? 数字、カンマ、ピリオドのどれかが1個以上連続 |
それぞれの項目の間には任意の文字(改行を含む)が存在するので、
<span class='rank_area rank\d+'>(\d+?)位</span>(?:.|\n)+?<a href='(.+?)'>(.*)</a>(?:.|\n)*?class='value'>([\d\,\.]+)?<
となります。
(\d+)? 1個以上の数字の最短マッチ
(\D+)? 1個以上の数字以外の最短マッチ
([\d\,\.]+)? 数字、カンマ、ピリオドのいずれかが1個以上の最短マッチ
?: キャッチアップ(抽出対象)としないことを意味する
(?:.\n)? 改行を含む任意の最短マッチ文字−キャッチアップ(抽出対象)しない
(?:class=\x22value\x22>)?
class="value"> の文字で最短マッチ−キャッチアップ(抽出対象)しない
\x22 「"」ダブルクォートを表すASCIIコード、「"」と直接記述すると文字列全体を囲む「"」と混同してしまうため。
正規表現の全体としては、
上記の赤文字(カッコ内)の部分が抽出する項目
それぞれ、見つかった順に、変数 %$1% , %$2% , %$3% , %$4% に格納されます。
コードの使用方法