【问题标题】:Simple HTML DOM get dynamic content loaded with JS简单的 HTML DOM 获取用 JS 加载的动态内容
【发布时间】:2017-02-16 16:48:00
【问题描述】:

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

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

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

Select an option

为什么?因为其他选项都是页面加载后用JS加载的。所以我的问题是如何在选择中获取这个动态加载的选项?

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

在我的包含 simple_html_dom 的 php 中:

$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 调用,但我觉得我做不到。那么我该如何实现呢?

谢谢

【问题讨论】:

  • but I feel far from being able to do it. 有人会因为我这样说而皱眉,但你可以使用 jQuery。有一个简单的 .get() 函数用于将 html 动态加载到元素中。
  • 你是说用 jQuery get() 替换 XMLHttpRequest 会解决这个问题吗?如果这是正确的,我真的不明白这有什么帮助,因为 get 函数无论如何都在后面实现了一个 XMLHttpRequest 对象。
  • 你当然可以继续使用 XMLHttpRequest,jQuery 的重点是它已经过实战测试,而且你说but I feel far...,但如果你觉得使用纯 javascript 还不错,那就可以了。你的要求当然是可行的。你可能会发现你没有等待 DOM 准备好,同样你可以在没有 jQuery 的情况下这样做,但是简单的$(function ()) 也会让 DOM 准备好一点点。
  • 我的问题是,既然是生成的代码,不知道选项加载在哪里
  • 你可以先用 jQuery 尝试一下,然后在你知道它正在工作时删除它等等。jQuery 有它的用途,一个很好的用途是快速模拟一个想法。使用纯 JavaScript,或者使用经过实战测试的库,选择权在你。哦,这听起来像是一些游戏节目:)

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


【解决方案1】:

首先使用无头浏览器呈现页面然后将其传递给简单的 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);
}

?>`

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2012-10-22
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多