0

使用简单的 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。

4

1 回答 1

0

只需在 simple_html_dom.php 中注释掉第 #695 行

if ($m[1]==='tbody') continue;

然后它应该读取 tbody。

于 2014-06-05T17:35:54.853 回答