Я пытаюсь получить динамически загружаемый контент с веб-страницы. В частности, параметры загружены для выбора. Так что если я сделаю:
$options = $html->find('select[class=theSelectClass]')[0]->find('option');
foreach($options as $option){
echo $option->text().'<br>';
}
Это работает, как ожидалось, и мой вывод:
Select an option
Зачем? Потому что другие параметры загружаются с JS после загрузки страницы. Итак, мой вопрос, как я могу получить эти динамически загруженные опции внутри выбора?
Это моя попытка использовать 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']);
Я пытался посмотреть, смогу ли я отправить Ajax-вызов из загруженного html-файла, но чувствую, что не в состоянии это сделать. Так как я могу сделать это?
Спасибо
Возможно, вам будет проще сначала использовать безголовый браузер для рендеринга страницы, а затем передать его простому 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);
}
?> `
Других решений пока нет …