【问题标题】:Simple HTML DOM: Notice->Trying to get property of non-object简单的 HTML DOM:Notice->尝试获取非对象的属性
【发布时间】: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


【解决方案1】:

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

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

然后它应该读取 tbody。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多