如何将simple_html_dom与phantomjs一起使用

时间:2018-01-07 18:48:10

标签: javascript php phantomjs simple-html-dom php-phantomjs

我试图让这两个库互相协作,我的当前代码如下所示:

  

phantomjs.js

var page = require('webpage').create();
var system = require('system');
var address = system.args[1]; 
page.open(address, function () {
    var content = page.content;
    console.log(content);
    phantom.exit();
 }); 
  

scraper.php

exec('phantomjs assets/phantomjs.js '.$page, $output);
$html2 = str_get_html($output);

我得到的是:

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 91

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1139

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1149

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

Warning: preg_match_all() expects parameter 2 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1620

Warning: strlen() expects parameter 1 to be string, array given in D:\XAMPP\htdocs\assets\php\simple_html_dom.php on line 1632

返回错误的simple_html_dom函数:

// remove noise from html content
// save the noise in the $this->noise array.
protected function remove_noise($pattern, $remove_tag=false)
{
    global $debugObject;
    if (is_object($debugObject)) { $debugObject->debugLogEntry(1); }

    $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);

    for ($i=$count-1; $i>-1; --$i)
    {
        $key = '___noise___'.sprintf('% 5d', count($this->noise)+1000);
        if (is_object($debugObject)) { $debugObject->debugLog(2, 'key is: ' . $key); }
        $idx = ($remove_tag) ? 0 : 1;
        $this->noise[$key] = $matches[$i][$idx][0];
        $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
    }

    // reset the length of content
    $this->size = strlen($this->doc);
    if ($this->size>0)
    {
        $this->char = $this->doc[0];
    }
}

当我使用var_dump($output)时,我得到了网站的HTML,所以我知道命令正在运行但是simple_html_dom似乎不接受它!

2 个答案:

答案 0 :(得分:1)

问题是:$output是数组,但str_get_html期望字符串作为参数。因此,请确保在解析之前将$ output转换为字符串。

答案 1 :(得分:0)

类似的东西:

$body = `phantomjs myscript.js`;
$doc = str_get_html($body);

你可能需要在phantomjs脚本中使用setTimeout,你没有给dom加载大量的时间。