シンプルな 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.