スカラー変数を使用した正規表現

IE利用−GetIeItemInfo(関数)

下図のような対象となるウェブページから、IE(GetIeItemInfo関数にてHTMLソースを取得し、正規表現を利用して項目を抽出します。

抽出する項目

順位、国名称、面積、国旗へのリンクアドレス
抽出した項目で、下図のような表を作成します。

抽出結果



対象となるウェブページ

世界の面積ランキング

プログラムの流れ

・指定URLの id = table01 の内容(テキスト- innerText)を表示−GetIeItemInfo関数

・同、HTMLソースを表示(innerHTML

・テーブル内のデータ個数を(GetRegExCount関数)表示

・HTMLを正規表現(GetRegEx関数)で解析し、必要な項目を抽出する


表示テキストからの抽出は不正確であるため、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>&nbsp;&nbsp;<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文字になるように前に半角空白を詰める。
!@@@@@@@@@@ とすると、左詰め(後部に半角空白)となる。

------------------------------------

コードの使用方法







HTMLソースを直接利用 GetWebDoc

対象となるウェブページは上記と同じ。

ただし、ここではGetWebDoc()関数を利用して、直接HTMLドキュメントソースを取得します。
IE(インターネットエクスプローラー)を使わないので、IEがインストールされていない場合でも動作。

ソースを表示してみます。

<!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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>

プログラムの流れ

・指定URLの ドキュメント全体を表示

・同、テーブル部分を表示−GetRegEx関数
    <table id='table01' xxx>〜 </table>  

・テーブル内のデータ個数を(GetRegExCount関数)表示

・HTMLを正規表現(GetRegEx関数)で解析し、必要な項目を抽出する

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% に格納されます。


コードの使用方法