1

我有一个脚本可以抓取一些旧的 HTML。它每天大约 1000 页,并且由于某种原因它经常阻塞并抛出以下错误:

PHP Catchable fatal error:  Argument 1 passed to DOMXPath::__construct() must be an instance of DOMDocument, null given, called in /var/scraper/autotrader/inc/QueryPath/QueryPath/CSS/DOMTraverser.php on line 417 and defined in /var/scraper/autotrader/inc/QueryPath/QueryPath/CSS/DOMTraverser.php on line 467

起初我以为是调用 htmlqp($html) 时产生了错误,但我将它包装在 try{} 语句中,它没有捕获任何内容:

更新:

我通过使用 @ 来查看脚本何时终止而没有错误,找到了有问题的代码行。就是这一行:

    try {
        $items = $html->find('.searchResultHeader')->find('.vehTitle'); //this one
    } catch (Exception $e) {
        var_dump(get_class($e));
        echo 'big dump'.$e->getTraceAsString();

    }

当它爆炸时,它甚至没有回声“大垃圾场”,所以它似乎真的没有抓住它。

我想知道这是否可能是 QueryPath 的错误处理而不是我自己的错误?

4

2 回答 2

0

这个:

$html->find('.searchResultHeader')->find('.vehTitle');

与此相同:

$html->find('.searchResultHeader .vehTitle');

但没有调用 null->find(); 的风险;

如果您真的想分两步完成,请使用 an if,而不是 a try

if($el = $html->find('.searchResultHeader')) $items = $el->find('.vehTitle');

或者也许是三元:

$items = ($el = $html->find('.searchResultHeader')) ? $el->find('.vehTitle') : null;
于 2013-08-09T02:13:29.487 回答
0

它没有捕捉到,因为标准的 try catch 块不会捕捉到这种类型的错误。为了捕获“可捕获”致命错误,需要为 E_RECOVERABLE_ERROR设置错误处理程序。

另请参阅:如何在 PHP 类型提示中捕获“可捕获的致命错误”?.

于 2013-11-11T14:17:22.043 回答