【问题标题】:PHP Fatal error: Call to a member function hasAttribute() on a non-objectPHP 致命错误:在非对象上调用成员函数 hasAttribute()
【发布时间】:2014-07-27 06:06:47
【问题描述】:

我在尝试获得siteadvisor.com 评级时在第 18 行遇到错误。错误消息显示"PHP Fatal error: Call to a member function hasAttribute() on a non-object"。我已经包含了我用来获得siteadvisor.com 评级的 ull php 代码。

public function getSiteAdvisor($domain)
{
    try
    {
        $callback_url = "http://www.siteadvisor.com/sites/" . $domain;

        $curl_response = $this->curl->get($callback_url);

        if ($curl_response->headers['Status-Code'] == "200") {

            libxml_use_internal_errors(TRUE);
            $this->dom_doc->loadHTML($curl_response);
            libxml_use_internal_errors(FALSE);

            $xpath = new DOMXPath($this->dom_doc);
            $tmp = $xpath->query('/html/body//div[@id="siteVerdict"]//img')->item(0);

            if ($tmp->hasAttribute('src')) {

                $tmp = $tmp->getAttribute('src');

                if (stripos($tmp, "green") !== false) {
                    $siteadvisor_rating = 1;
                } elseif (stripos($tmp, "yellow") !== false) {
                    $siteadvisor_rating = 2;
                } elseif (stripos($tmp, "red") !== false) {
                    $siteadvisor_rating = 3;
                } else {
                    $siteadvisor_rating = 0;
                }

            } else {
                $siteadvisor_rating = 0;
            }

        } else {
            $siteadvisor_rating = 0;
        }

        $response = array(
            'status' => 'success',
            'data' => array(
                'siteadvisor' => (int)$siteadvisor_rating
            )
        );
    }
    catch (Exception $e)
    {
        $response = array(
            'status' => 'error',
            'msg' => $e->getMessage()
        );
    }
    return $response;       
}

【问题讨论】:

  • 来自 PHP 的 xpath::query() 手册:如果表达式格式错误或 contextnode 无效,则 DOMXPath::query() 返回 FALSE。

标签: php html xpath web-scraping domdocument


【解决方案1】:

我认为您的 xpath 查询有问题(正如 Gordon 所说):,改为定位 alt="" 属性。

$domain = 'google.com';
$callback_url = "http://www.siteadvisor.com/sites/" . $domain;
// i know you know what do to just you can just adjust this
$curl_response = file_get_contents($callback_url);
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($curl_response);
libxml_use_internal_errors(true);
$xpath = new DOMXpath($dom);

$siteadvisor_rating = null;
$img_rating = $xpath->query('//div[@id="siteVerdict"]/div/img');

    if($img_rating->length > 0) {
    // haystack
    if($img_rating->item(0)->hasAttribute('alt')) {
        $img_rating = $img_rating->item(0)->getAttribute('alt');
    } elseif ($img->item(0)->hasAttribute('src')) {
        $img_rating = $img_rating->item(0)->getAttribute('src');
    }

    if(stripos($img_rating, 'green') !== false) {
        $siteadvisor_rating = 1;
    } elseif(stripos($img_rating, '') !== false) {
        $siteadvisor_rating = 2;
    } elseif(stripos($img_rating, 'red') !== false) {
        $siteadvisor_rating = 3;
    } else {
        $siteadvisor_rating = 0;
    }

    echo $siteadvisor_rating; // should be 1 for google :)
}

else {
    // no node is found
}

【讨论】:

  • 嗨@ghost 您的代码正在运行,但看起来siteadvisor.com 有时不会处理报告,因为我尝试通过访问siteadvisor.com 并进行手动测试。如果 siteadvisor.com 没有发送正确的信息而不是停止进程,有什么方法可以绕过它?
  • @KevinS 我可以知道手动测试发生了什么吗?你是什​​么意思siteadvisor.com 没有处理?发生什么了?以及 siteadvisor.com 确实提供了错误信息的决定性因素是什么
  • 我得到了错误PHP Fatal error: Call to a member function hasAttribute() on a non-object in stats.class.php on line 750所以我去了siteadvisor.com并试图得到几个网站的测试结果,但我不得不尝试几次才能得到报告。看起来只有当siteadvisor.com 不处理域的报告时才会抛出错误。我已将stats.class.php 的整个代码粘贴到http://pastebin.com/SRArC6vg
  • @KevinS 我的想法是,如果网站无法处理,只需在代码上使用简单的短路,只需放在 // haystack line 之前:if($img_rating->length > 0) { // continue process } else { // error }
  • 根据您的建议,看来我必须在 行号某处更改 process.php 文件。 193 到 200。我已经在http://pastebin.com/wfguWPqp 发布了process.php 文件,请您查看该文件并让我知道如何应用您的建议,因为我对php 很陌生?谢谢
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多