0

シンプルな HTML DOM を使用して Web サイトをスクレイピングすると、PHP 通知が表示されます。2 つの通知が表示され、print_r 関数を使用して表示すると、その下に表示されるすべてが完璧に見えます。

Web サイトのテーブル構造は次のとおりです。

    <table class=data schedTbl>
        <thead>
            <tr>
                <th>DATA</th>
                <th>DATA</th>
                <th>DATA</th>
                etc....
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>
                    <div class="class1">DATA</div>
                    <div class="class2">SAME DATA AS PREVIOUS DIV</div>
                </td>
                <td>DATA</td>
                <td>DATA</td>
                etc....
            </tr>
            <tr>
                <td>
                    <div class="class1">DATA</div>
                    <div class="class2">SAME DATA AS PREVIOUS DIV</div>
                </td>
                <td>DATA</td>
                <td>DATA</td>
                etc....
            </tr>
            <tr>
                <td>
                    <div class="class1">DATA</div>
                    <div class="class2">SAME DATA AS PREVIOUS DIV</div>
                </td>
                <td>DATA</td>
                <td>DATA</td>
                etc....
            </tr>
            etc....
        </tbody>
    </table>

以下のコードは、テーブル [class=data schedTbl] 内のすべての tr を検索するために使用されます。私はそこに tbody セレクターを持っていますが、まだスレッドの tr を選択しているため、このセレクターには注意を払っていないようです。

    include('simple_html_dom.php');

    $articles = array();

    getArticles('www.somesite.com');

    function getArticles($page) {
         global $articles;

         $html = new simple_html_dom();
         $html->load_file($page);

         $items = $html->find('table[class=data schedTbl] tbody tr');  

         foreach($items as $post) {

             $articles[] = array($post->children(0)->first_child(0)->plaintext,//0 -- GAME DATE
                        $post->children(1)->plaintext,//1 -- AWAY TEAM
                        $post->children(2)->plaintext);//2 -- HOME TEAM

         }

    }

したがって、レコードが 1 つしかない最初の td の最初の子を呼び出しているため、通知は thead の tr から来ると思います。2 つの理由は、実際には本体に同じデータ構造を持つ 2 つのテーブルがあるためです。

繰り返しますが、これを解決するには2つの方法があると思います。

1)おそらく最も簡単です(検索セレクターを修正して、TBODYが機能し、tbodies内のtdsのみを選択するようにします)

2) first_child フィルターが不要な場合にそれを実行しない方法を考え出しますか?

私が受け取っている print_r($articles) 出力のスナップショットが必要な場合はお知らせください。

提供されたヘルプに事前に感謝します!

心から、

ビル C.

4

1 に答える 1