Получить / загрузить динамический контент DIV с внешнего сайта - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь извлечь часть контента (строку из 8 символов) с веб-сайта государственной службы и отобразить его на своем собственном веб-сайте. Веб-сайт государственной службы (PS) позволяет повторно использовать контент, поэтому никаких проблем нет.

Строка, которую я пытаюсь извлечь с веб-сайта PS, находится внутри div. Когда я выбираю эту конкретную часть содержимого в своем веб-браузере и запрашиваю источник выбора DOM, я получаю:

<div class="last-license-plate-truck">8426-STS</div>

Таким образом, извлечь это будет очень легко с помощью сценария jQuery или PHP, нацеленного на div класс ... но это не работает . Мой скрипт всегда возвращает пустую строку при проверке this частности div. Однако проверка других div-ов на той же странице возвращает содержимое совершенно нормально, поэтому используемый мной скрипт работает нормально.

Я обнаружил, что если я загружаю сайт PS в своем браузере, а затем запрашиваю исходный код страницы, не выделяя текст, я получаю:

<div class="last-license-plate-truck"></div>

Так что в исходном кодеdiv пусто, но браузер по-прежнему отображает последний номерной знак, когда я захожу на сайт PS .. Я подозреваю, что информация о последнем номерном знаке динамически вводится в div с помощью JavaScript или чего-то еще после завершения загрузки страницы.

Есть ли какой-либо способ извлечь содержимое этого конкретного div? Я полагаю, что это должно быть как-то возможно, поскольку строка символов, которую я ищу, присутствует в DOM?

РЕДАКТИРОВАТЬ - мой код ниже:

    <?php
    $host = 'example.com';

    if($socket =@ fsockopen($host, 80, $errno, $errstr, 5)) {

        fclose($socket);

        $last_plate = array(
            "https://www.example.com/page1"=>"car",
            "https://www.example.com/page2"=>"truck",
        );

        foreach($last_plate as $url => $keyword) {

            $page = file_get_contents($url);
            $doc = new DOMDocument();
            libxml_use_internal_errors(true);
            $doc->loadHTML($page);
            libxml_use_internal_errors(false);
            $divs = $doc->getElementsByTagName('div');

            $found = array($keyword => "notfound");

            foreach($divs as $div) {

                if ($div->getAttribute('class') === 'last-license-plate-'.$keyword) {

                    $found[$keyword] = "found";

                    $cleaned = preg_replace ('/[^a-zA-Z0-9-]+/', '', $div->nodeValue);

                    $cleaned = str_replace(array("\r", "\n", ' '), '', $cleaned);
                }

            }

            if($found[$keyword] != "found") {

                echo '<p>The last license plate was not found.</p>'."\n";

            }else{

                echo '<p>The last license plate is: '.$cleaned.'</p>'."\n";

            }

        }

    }else{
        echo '<p>Sorry, please try again later.</p>';
    }
    ?>

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Пожалуйста, смотрите комментарий @hakre выше. Это дало ответ на мой вопрос.

Небольшая предыстория о том, как: он отключил мою первоначальную идею синтаксического анализа всей страницы и поиска содержимого определенного div. Я загрузил соответствующий веб-сайт государственной службы в свой браузер и открыл инструментарий разработчика (F12);перешел на вкладку «Сеть», перезагрузил страницу и применил фильтры только для прослушивания трафика JS и XHR. Оттуда я смог извлечь URL конечной точки, отвечающий за динамическую загрузку содержимого <div class="last-license-plate-truck"></div> div. Оказалось, что конечная точка (REST API) ответила хорошим форматом JSON, который я легко мог получить с помощью PHP.

0 голосов
/ 17 октября 2019

используйте innerText вместо nodeValue.

Замените следующую строку

$cleaned = preg_replace ('/[^a-zA-Z0-9-]+/', '', $div->nodeValue);

на

$cleaned = preg_replace ('/[^a-zA-Z0-9-]+/', '', $div->innerText);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...