【PHP】Simple HTML DOM Parserでtbody要素にアクセスできないので何とかする。

PHP で HTML を解析するときに便利なライブラリ『Simple HTML DOM Parser』。その名のとおり、シンプルで使い勝手の良いライブラリです。

PHP Simple HTML DOM Parser | SourceForge.net - ダウンロードページ
オンラインドキュメント(英語)

これを使って、HTML ドキュメントからテーブル内のデータを抜き出してゴニョゴニョするスクリプトを書いてみたのですが…。

table要素って、行儀の良い HTML だと以下のような構造です。

<table>
  <thead>
    <!-- 見出し行 -->
  </thead>
  <tbody>
    <!-- テーブル本体 -->
  </tbody>
</table>

で今回、見出し行は無視して、テーブル本体のデータのみを tbody 要素から取り出して弄ろう、と思って以下のような感じにしてみたら、Fatal error を吐いて途中で止まってしまう。

入力ファイル "in.html" 内に table 要素はひとつだけ。tbody 要素もその中にひとつだけ、という前提で。

<?php

require_once( 'simple_html_dom.php' );

$html = file_get_html( 'in.html' );   // in.html :入力ファイル

$tbody = $html->find( 'tbody' );   // html 内の tbody 要素のコレクションを取り出す。tbody 要素は html 内にひとつだけなので、それには $tbody[0] でアクセスできる。

$tr = $tbody[0]->find( 'tr' );   // tbody 内の tr 要素のコレクションを取り出す。

// 以下、ゴニョゴニョ。

?>

これがエラーで動かない。

いろいろチェックしてみると、

$tbody = $html->find( 'tbody' );

という操作の後の $tbody のサイズがゼロ。つまり「この html 内に tbody 要素は無いよ」と言われているの。あるのに。

う〜ん、おかしいな〜。

と思って simple_html_dom.php のコードを見てみると、こんな記述が…。700行目あたり。

      // for browser generated xpath
      if ($m[1]==='tbody') continue;

理由あって tbody がスキップされてる。

もしかしたら一般的にはこれで良いのかもしれないけれど、今回の用途に関してはこれでは困る。回避してみましょ。対処法は簡単で、

  • simple_html_dom.php の上記の部分をコメントアウトする。

または、

  • find( ) の引数に 'tbody' ではなく 'TBODY' を渡す。

このいずれかで、ひとまず上手く動きます。

ということで。

カテゴリ: