better done than better said

困ったときに調べた結果

phpの正規表現マッチ(preg_match)でtableをスクレイピングする。

プラグインを入れるのが面倒だったりする場合、サクッとpreg_matchでtableデータをスクレイピングしてみるメモ。 時間なくてほんとメモ程度のものです。

HTMLはこちら

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>HTML5サンプル</title>
</head>
<body>
  <table class="table table-bordered datatable">
    <thead>
      <tr>
        <th>DATE</th>
        <th>IMP</th>
        <th>CLICK</th>
        <th>CTR</th>
        <th>PROFIT</th>
        <th>CPM</th>
        <th>CPC</th>
      </tr>
    </thead>
    <tbody>
      <tr class="color_fri">
        <td>2019-02-01</td>
        <td>13,305</td>
        <td>205</td>
        <td>1.54</td>
        <td>1,459.0</td>
        <td>118.4</td>
        <td>7.7      </td>
      </tr>
      <tr class="color_sat">
        <td>2019-02-02</td>
        <td>12,707</td>
        <td>241</td>
        <td>1.90</td>
        <td>1,518.0</td>
        <td>129.0</td>
        <td>6.8      </td>
      </tr>
      <tr class="color_sun">
        <td>2019-02-03</td>
        <td>6,915</td>
        <td>136</td>
        <td>1.97</td>
        <td>866.0</td>
        <td>135.3</td>
        <td>6.9      </td>
      </tr>
      <tr class="color_mon">
        <td>2019-02-04</td>
        <td>8,043</td>
        <td>162</td>
        <td>2.01</td>
        <td>1,005.0</td>
        <td>135.0</td>
        <td>6.7      </td>
      </tr>
      <tr class="color_tue">
        <td>2019-02-05</td>
        <td>8,179</td>
        <td>161</td>
        <td>1.97</td>
        <td>1,002.0</td>
        <td>132.3</td>
        <td>6.7      </td>
      </tr>
    </tbody>
  </table>
  </body>
</html>

# 上記HTMLを何かしらで取得する
$data = file_get_contents('./x.html');


preg_match('#<table[^>]*>(?<data>.*?)</table[^>]*>#s', $data, $m);
preg_match_all('#<tr[^>]*>(?<data>.*?)</tr[^>]*>#s', $m['data'], $m);


foreach ($m['data'] as $k => $tr) {
    preg_match_all('#<td[^>]*>(?<data>.*?)</td>#is', $tr, $m);
}
var_dump($m);