使用简单的 html dom 抓取网站时,我收到了 php 通知。显示了 2 个通知,并且在使用 print_r 函数显示它时,下面呈现的所有内容看起来都很完美。
网站表结构如下:
<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>
下面的代码用于查找 table[class=data schedTbl] 中的所有 tr。我在那里有一个 tbody 选择器,但它似乎没有注意这个选择器,因为它仍然选择了 thead 中的 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
}
}
所以,我相信通知来自thead 中的tr,因为我正在调用只有一条记录的第一个td 的第一个孩子。两个的原因是body中实际上有两个具有相同数据结构的表。
同样,我相信有两种方法可以解决这个问题:
1)可能是最简单的(修复查找选择器,使 TBODY 工作并且只选择 tbodies 中的 tds)
2) 想办法在不需要时不做 first_child 过滤器?
如果您想要我收到的 print_r($articles) 输出的快照,请告诉我。
提前感谢您提供的任何帮助!
真挚地,
比尔 C。