2017-03-03 50 views
0

我以前的問題是這個parse the html data to array data in php裏面調用一個函數功能laravel 5.4

參照此Answer,我是想同樣的事情在laravel。它的實施給我的錯誤一樣DOMXPath::query(): Unable to call handler hasClasses()然後,我使用類似下面

我laravel代碼:

function hasClasses($attrValue, $requiredClasses) 
{ 
    $requiredClasses = explode(' ', $requiredClasses); 
    $classes = preg_split('~\s+~', $attrValue, -1, PREG_SPLIT_NO_EMPTY); 

    return array_diff($requiredClasses, $classes) ? false : true; 
} 


function getScrapedata($keyword = 'laravel') 
{ 
    $client = new Client(); 
    $client->setHeader('user-agent', "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3"); 
    $crawler = $client->request('GET', 'http://duckduckgo.com/?q=' . $keyword); 
    $string = $crawler->filter('div#links.results')->html(); 

    $dom = new \DOMDocument; 
    $state = libxml_use_internal_errors(true); 
    $dom->loadHTML($string); 
    libxml_use_internal_errors($state); 

    $xp = new \DOMXPath($dom); 
    $xp->registerNamespace('php', 'http://php.net/xpath'); 
    $xp->registerPhpFunctions('hasClasses'); 

    $mainDivClasses = 'result results_links results_links_deep web-result'; 
    $childDivClasses = 'links_main links_deep result__body'; 

    $divNodeList = $xp->query('//div[php:functionString("' . $this->hasClasses('class', $mainDivClasses) . '")] 
           /div[php:functionString("' . $this->hasClasses('class', $mainDivClasses) . '")]'); 

    $array_data = []; 
    foreach ($divNodeList as $divNode) { 
     $array_data[] = [ 
      trim($xp->evaluate('string(./h2/a[@class="result__a"])', $divNode)), 
      trim($xp->evaluate('string(.//a[@class="result__snippet"])', $divNode)), 
      trim($xp->evaluate('string(.//a[@class="result__url"])', $divNode)), 
     ]; 
    } 

    dd($array_data); 
} 

因此然後開始給我另一個錯誤此DOMXPath::query(): Unable to call handler()

所以實際的錯誤是在這裏:

$divNodeList = $xp->query('//div[php:functionString("'.$this->hasClasses('class',$mainDivClasses).'")] 
           /div[php:functionString("'.$this->hasClasses('class',$mainDivClasses).'")]'); 

有人可以幫我了這一點。如何完全調用函數?你能解決這個

+0

這是在一個類內還是隻是功能? –

+0

兩者都屬於同一班級。 @RossWilson – 06011991

+0

@RossWilson:你有沒有得到任何解決方案? – 06011991

回答

0

的一種方法是改變你的hasClasses方法是:

static function hasClasses($attrValue, $requiredClasses) 

那麼你應該能夠做到:

$divNodeList = $xp->query('//div[php:functionString("' . static::class . '::hasClasses", @class, "' . $mainDivClasses . '")] 
        /div[php:functionString("' . static::class . '::hasClasses", @class, "' . $childDivClasses . '")]'); 

希望這有助於!

+0

'DOMXPath ::查詢():不允許調用處理程序「應用\ HTTP \控制器\的HomeController :: hasClasses()」'這是我得到 – 06011991

+0

@ 5367683在這種情況下,錯誤可以添加整個類。那些功能在? –

+0

我的班級名稱是'HomeController'我需要添加嗎? – 06011991

相關問題