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

问题描述 投票:0回答:2

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

我要从PS网站提取的字符串位于div内。当我在Web浏览器中选择内容的特定部分并请求选择的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网站时浏览器仍显示最后一个车牌。我怀疑最后一个车牌信息是通过JavaScript或其他方式动态注入到div中的页面加载完成。

还有什么方法可以提取特定的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>';
    }
    ?>
php dom
2个回答
0
投票

使用innerText代替nodeValue

替换下一行

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

with

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.