【问题标题】:PHP DOM parser errorPHP DOM 解析器错误
【发布时间】:2014-09-17 16:52:09
【问题描述】:

我有解析网页的代码。包含用于解析每个页面的 foreach。第一个循环正确执行,另一个在解析器中失败。致命错误:在 C:\wamp\www\parser\dom.php 1129 行的非对象上调用成员函数 find()。

Parser 是 PHP Simple HTML DOM Parser - http://sourceforge.net/projects/simplehtmldom/

<?php
header('Content-Type: text/html; charset=utf-8');
include ('dom.php');
$mysql = mysqli_connect("localhost", "root", "", "db");


$import['id'][]=3;
$import['url'][]='http://sitea.com';
$import['id'][]=2;
$import['url'][]='http://siteb.com';
$import['id'][]=1;
$import['url'][]='http://sitec.com';

for($i=0; $i<count($import['id']); $i++){
    $coupons=array();
    $id=0;
    $parser = new simple_html_dom();
    $parser->load_file($import['url'][$i]);

    foreach($parser->find('section[class=couponList]', 0)->find('article[class=coupon]') as $coupon){
        $coupons[$id]['name']=trim($coupon->find('div[class=name]',0)->plaintext);
        $date=explode(' ', trim($coupon->find('p[class=dateFormat]',0)->plaintext));
        $coupons[$id]['date-from']=strtotime(trim($date[45]));
        $coupons[$id]['date-to']=strtotime(trim($date[130]));
        $coupons[$id]['description']=trim($coupon->find('div[class=description]',0)->plaintext);
        $coupons[$id]['sale']=@trim($coupon->find('div[class=couponImageContainer] div p',0)->plaintext);
        $coupons[$id]['id']=$coupon->attr['data-id'];

        //Code
        if(trim($coupon->find('div[class=couponColorType]',0)->plaintext)=='Kód'){
            $parser2 = new simple_html_dom();
            $parser2->load_file($import['url'][$i].'?cpn_id='.$coupon->attr['data-id']);
            $coupons[$id]['code']=strip_tags($parser2->find('span[class=popupCode]',0));
            $coupons[$id]['type']="kod";
        }else{
            $coupons[$id]['type']="nabidka";
            $page=file_get_contents('http://slevovekody.com/r/'.$coupon->attr['data-id']);
            $data=explode("window.location = '", $page);
            $data=explode("';", @$data[1]);

            $u=explode('http://', $data[0]);
            if(count($u)>2){
                $u='http://'.$u['2'];
            }else{
                $u=$data[0];
            }
            $u=explode('?', $u);
            $coupons[$id]['url']=$u[0];
        }
        $id++;
    }
    foreach($coupons as $c){            
        if(mysqli_num_rows(mysqli_query($mysql, "SELECT * FROM coupon WHERE id_import='".$c['id']."'"))==0){
            mysqli_query($mysql, "INSERT INTO `coupon` (`eshop`, `id_import`, `name`, `alias`, `description`, `type`, `from`, `to`, `code`, `url`, `sale`) VALUES ('".$import['id'][$i]."', '".$c['id']."', '".$c['name']."', '".makeAlias($c['name'])."', '".$c['description']."', '".strtolower($c['type'])."', '".$c['date-from']."', '".$c['date-to']."', '".@$c['code']."', '".@$c['url']."', '".$c['sale']."')");
        }
    }
    var_dump($coupons);
    unset($coupons);
}

?>

错误

Fatal error: Call to a member function find() on a non-object in C:\wamp\www\parser\dom.php on line 1129
Call Stack
#   Time    Memory  Function    Location
1   0.0010  291880  {main}( )   ..\index.php:0
2   5.5803  21923208    simple_html_dom->find( )    ..\index.php:20

在线出错:

foreach($parser->find('section[class=couponList]', 0)->find('article[class=coupon]') as $coupon){

【问题讨论】:

    标签: php parsing dom fatal-error


    【解决方案1】:

    如果 find() 调用未找到任何内容(例如,没有匹配项),则返回 NULL。因此,您可以 NOT 以您的方式链接 find() 调用,因为任何失败的查找都将返回 null 并导致您的“非对象调用”。

    例如

    $x = $dom->find('element_that_does_not_exist');  // $x becomes null
    $x->find('body');
    

    相当于做null-&gt;find()

    您必须捕获中间结果并查看是否有任何匹配项,例如

    $x = $dom->find('element_that_does_not_exist');
    if (!is_null($x)) {
       $y = $x->find('other stuff');
    }
    

    【讨论】:

    • 即使在同一站点使用循环也会显示错误。内容 100% 存在。
    猜你喜欢
    • 2018-02-23
    • 2013-04-06
    • 2015-11-06
    • 2013-11-14
    • 1970-01-01
    • 2016-10-18
    • 2013-11-06
    • 2011-10-13
    • 2015-08-25
    相关资源
    最近更新 更多