我正在尝试从公共服务网站中提取一段内容(由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>';
}
?>
答案 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轻松地捕获它。