从外部网站获取/加载动态DIV内容

时间:2019-10-17 12:21:55

标签: php dom

我正在尝试从公共服务网站中提取一段内容(由8个字符组成的字符串),并将其显示在我自己的网站上。公共服务(PS)网站允许重复使用内容,因此在那里没有麻烦。

我要从PS网站提取的字符串位于div内。当我在网络浏览器中选择内容的特定部分并请求选择的DOM源时,我得到:

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

因此,使用针对div类的jQuery或PHP脚本进行提取非常容易... 但它不起作用。当探查 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 :(得分:0)

使用innerText代替nodeValue

替换下一行

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

使用

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

答案 1 :(得分:0)

请参阅上面的@hakre的评论。它为我的问题提供了答案。

有关如何的一些背景知识: 调整后,可以简化我解析整个页面并查找特定div内容的最初想法。我在浏览器中加载了有问题的公共服务网站,并打开了开发者工具包(F12);导航到“网络”标签,重新加载页面并将过滤器仅应用于嗅探JS和XHR流量。从那里,我能够提取负责动态加载<div class="last-license-plate-truck"></div> div内容的端点URL。事实证明,端点(REST API)以一种不错的JSON格式进行了响应,我可以使用PHP轻松地捕获它。