【发布时间】:2013-01-25 18:51:01
【问题描述】:
我在使用简单的 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>
下面的代码用于查找表[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。
【问题讨论】:
-
大家好,不要浪费你的时间试图回答,我是在这个网站上的一个问题的帮助下得到的。似乎在 simple_html_don.php 文件中避免了 tbody。要解决这个问题,只需注释掉第 695 行,if ($m[1]==='tbody') continue;,现在它读取为 tbody。
标签: php html web-scraping simple-html-dom