简单的HTML DOM获取用JS加载的动态内容

时间:2016-10-07 15:58:50

标签: javascript php ajax simple-html-dom dynamic-content

我正在尝试从网页上获取动态加载的内容。特别是加载到选择的选项。所以,如果我这样做:

$options = $html->find('select[class=theSelectClass]')[0]->find('option');
foreach($options as $option){
     echo $option->text().'<br>';
}

这按预期工作,我的输出是:

Select an option

为什么呢?因为页面加载后其他选项都加载了JS。所以我的问题是如何在select?

中获得这个动态加载的选项

这是我尝试使用JS Ajax和另一个PHP页面:

在我的php中包含simple_html_dom:

$html->load_file($base);
$var = '<script>

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
           this.responseText;
        }
    };
    xhttp.open("GET", "http://localhost/crawler/ajax.php?param=HelloWorld", true);
    xhttp.send();

</script>';
$e = $html->find("body", 0);
$e->outertext = $e->makeup() . $e->innertext . $var . '</body>';

和我的ajax.php文件:

file_put_contents ( 'ajax.txt' , $_GET['param']);

我试图看看我是否可以从加载html的文件中发送Ajax调用,但我觉得我无法做到这一点。那么我该如何实现呢?

谢谢

1 个答案:

答案 0 :(得分:0)

您可能更容易首先使用无头浏览器呈现页面,然后将其传递给简单的html dom。您可以使用CasperJS / PhantomJS或其他使用javascript渲染页面的工具来执行此操作。

`

require("vendor/autoload.php");
use Sunra\PhpSimple\HtmlDomParser;
use Browser\Casper;
$casper = new Casper();
// forward options to phantomJS
// for example to ignore ssl errors
$casper->setOptions(array(
    'ignore-ssl-errors' => 'yes'
));
$casper->start('https://www.reddit.com');
$casper->wait(5000);
$output = $casper->getOutput();
$casper->run();
$html = $casper->getHtml();
$dom = HtmlDomParser::str_get_html( $html );
$elems = $dom->find("a");
foreach($elems as $e){
    print_r($e->href);
}

&GT;`