Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PHP saveHTML函数未正确保存HTML_Javascript_Php_Html_Dom_Curl - Fatal编程技术网

Javascript PHP saveHTML函数未正确保存HTML

Javascript PHP saveHTML函数未正确保存HTML,javascript,php,html,dom,curl,Javascript,Php,Html,Dom,Curl,我一直在尝试使用PHP保存一段代码的源代码。当我提取整个网页的内容时,源代码顺序被保留,但当我试图使用 $dom = new DOMDocument; $dom->loadHTML($webpage); $xpath = new DOMXPath($dom); $query_tag = "//div[contains(@class, 'class-name')]"; $result = $dom->saveHTML($xpath->query($query_tag)->

我一直在尝试使用PHP保存一段代码的源代码。当我提取整个网页的内容时,源代码顺序被保留,但当我试图使用

$dom = new DOMDocument;
$dom->loadHTML($webpage);
$xpath = new DOMXPath($dom);

$query_tag = "//div[contains(@class, 'class-name')]";
$result = $dom->saveHTML($xpath->query($query_tag)->item(0));
脚本标签被弄乱了。到目前为止,这是唯一一个发生此问题的网站。
saveHTML
函数是否存在一些我不知道的限制

这是我应该得到的:

<div id="sponsored-category-header" class="page-header sponsored-category-header clear"> <script type="text/javascript">jQuery(document).ready(function($) {
        var cat_head_params = {"sponsor":"SEO PowerSuite","sponsor_logo":"https:\/\/www.searchenginejournal.com\/wp-content\/plugins\/abm-sej\/includes\/category-images\/SPS_128.png","sponsor_text":"<div class=\"taxonomy-description\">Dominate Google local search results with ease! Get your copy of SEO PowerSuite and keep <a rel=\"nofollow\" href=\"http:\/\/sejr.nl\/PowerSuite-2016-5\" onClick=\"__gaTracker('send', 'event', 'Sponsored Category Click Var 1', 'Local Search', 'SEO PowerSuite');\" target=\"_blank\">your local SEO strategy<\/a> up to par.<\/div>","logo_url":"http:\/\/sejr.nl\/PowerSuite-2016-5","ga_labels":["Local Search","SEO PowerSuite"]}            
        $('#sponsored-category-header').append('<div class="sponsored-category-logo"></div>');
                     $('#sponsored-category-header .sponsored-category-logo').append(' <a rel="nofollow" href="'+cat_head_params.logo_url+'" onClick="__gaTracker(\'send\', \'event\', \'Sponsored Category Click Var 1\', \''+cat_head_params.ga_labels[0]+'\', \''+cat_head_params.ga_labels[0]+'\');" target="_blank"><img class="nopin" src="'+cat_head_params.sponsor_logo+'" width="96" height="96" /></a>');
                                   $('#sponsored-category-header').append('<div class="sponsored-category-details"></div>');
         $('#sponsored-category-header .sponsored-category-details').append('<h3 class="page-title sponsored-category-title">'+cat_head_params.sponsor+'</h3>');
         $('#sponsored-category-header .sponsored-category-details').append(cat_head_params.sponsor_text);


});</script> </div>
jQuery(文档).ready(函数($){
var cat_head_params={“赞助商”:“搜索引擎优化动力套件”,“赞助商徽标”:“https:\/\/www.searchenginejournal.com\/wp content\/plugins\/abm sej\/包括\/category images\/SPS_128.png”,“赞助商文本”:“轻松掌控谷歌本地搜索结果!获取搜索引擎优化动力套件副本并保存”);
$(“#赞助类别标题”)。附加(“”);
$(“#赞助类别标题。赞助类别详细信息”)。追加(“”+类别标题参数。赞助+“”);
$(“#赞助商类别标题.赞助商类别详细信息”).append(类别标题参数.赞助商文本);
}); 
这就是我实际得到的:

<div id="sponsored-category-header" class="page-header sponsored-category-header clear"> <script type="text/javascript">jQuery(document).ready(function($) {
        var cat_head_params = {"sponsor":"SEO PowerSuite","sponsor_logo":"https:\/\/www.searchenginejournal.com\/wp-content\/plugins\/abm-sej\/includes\/category-images\/SPS_128.png","sponsor_text":"<div class=\"taxonomy-description\">Dominate Google local search results with ease! Get your copy of SEO PowerSuite and keep <a rel=\"nofollow\" href=\"http:\/\/sejr.nl\/PowerSuite-2016-5\" onClick=\"__gaTracker('send', 'event', 'Sponsored Category Click Var 1', 'Local Search', 'SEO PowerSuite');\" target=\"_blank\">your local SEO strategy<\/a> up to par.<\/div>","logo_url":"http:\/\/sejr.nl\/PowerSuite-2016-5","ga_labels":["Local Search","SEO PowerSuite"]}            
        $('#sponsored-category-header').append('<div class="sponsored-category-logo"></script>


</div>');
                     $('#sponsored-category-header .sponsored-category-logo').append(' <a rel="nofollow" href="'+cat_head_params.logo_url+'" onclick="__gaTracker(\'send\', \'event\', \'Sponsored Category Click Var 1\', \''+cat_head_params.ga_labels[0]+'\', \''+cat_head_params.ga_labels[0]+'\');" target="_blank"><img class="nopin" src="'+cat_head_params.sponsor_logo+'" width="96" height="96"></a>');
                                   $('#sponsored-category-header').append('<div class="sponsored-category-details"></div>');
         $('#sponsored-category-header .sponsored-category-details').append('<h3 class="page-title sponsored-category-title">'+cat_head_params.sponsor+'</h3>');
         $('#sponsored-category-header .sponsored-category-details').append(cat_head_params.sponsor_text);


    }); </div>
jQuery(文档).ready(函数($){
var cat_head_params={“赞助商”:“搜索引擎优化动力套件”,“赞助商徽标”:“https:\/\/www.searchenginejournal.com\/wp content\/plugins\/abm sej\/包括\/category images\/SPS_128.png”,“赞助商文本”:“轻松掌控谷歌本地搜索结果!获取搜索引擎优化动力套件副本并保存”);
$(“#赞助类别标题”)。附加(“”);
$(“#赞助类别标题。赞助类别详细信息”)。追加(“”+类别标题参数。赞助+“”);
$(“#赞助商类别标题.赞助商类别详细信息”).append(类别标题参数.赞助商文本);
}); 
如果没有找到,则结尾的
脚本
标记会上移几行

我要明确的是,我不是在说呈现的HTML。我是在说我在提出请求后得到的实际源代码。任何关于如何解决此问题的帮助都将不胜感激


我知道函数
saveHTML
导致了这个问题,因为当我通过PHP回显整个页面时,每个标记都在正确的位置。

首先,您的代码应该触发一系列类似以下的警告:

警告:DOMDocument::loadHTML():HTMLParserEntityRef:中应为“;” 实体
警告:DOMDocument::loadHTML():意外的结束标记: 实体中的strong
警告:DOMDocument::loadHTML():标记头 在实体中无效

这是对野生HTML的期望(该页面的代码也不是特别糟糕),但您甚至没有提到它,这让我怀疑您可能没有在开发框中启用错误报告

此外,该页面包含大量JavaScript,而
DOMDocument
只是一个HTML解析器

这样,我们就可以清楚地了解正在发生的事情。由于
DOMDocument
不是一个成熟的浏览器,它不理解JavaScript代码。这意味着它检测到
标记,但它不会像JavaScript一样处理其内容,它只会查找结束标记,他找到的第一个标记是:

$('#sponsored-category-header').append('<div class="sponsored-category-logo"></div>');
                                                                             ^^^^^^
$(“#赞助类别标题”)。附加(“”);
^^^^^^
它不知道这是一个JavaScript字符串,应该被忽略。相反,它认为关闭了错误的标记,因此尝试修复技术上无效的HTML,并添加缺少的
标记

正是由于这个原因,
标记集传统上是这样编写的:

<script type="text/javascript"><!--
var foo = '<p>Escaped end tag<\/p>';
//--></script>

…因此,不知道JavaScript的用户代理可以安全地忽略整个标记(嘿,这只是一个很好的旧HTML注释)。然而,现在这几乎被普遍认为是不好的做法,因为“所有浏览器都理解JavaScript”


最后一点注意:DOM扩展可能知道
标记,并且知道不允许在其中包含其他标记。这解释了为什么不考虑内部打开标记。

DOMDocument
是一个合适的HTML解析器,因此它无法处理您经常在野外发现的无效标记。就像您的浏览器一样,它将修复HTML尽其所能。@alvarogonzález所以,在
$dom->loadHTML($webpage);
之后,源代码会变得一团糟。?正确。我没有机会检查网站,但是,如果有无效的标记(我不是说这里是否有这种情况,因此我会留下评论而不是答案),因为PHP需要使用文档树的内存表示(正如我所说,这是任何浏览器都要做的)。源代码只是一个源代码,我在您感兴趣的部分的页面上没有看到任何无效的内容,但是如果不先分解流程并检查每个步骤以消除
loadHTML
DOMXPath
、和
query
的话,我会犹豫是否要特别责备saveHTML。谢谢@linuxc查询出错了吗?这是我使用的查询
//div[contains(@class,'post data')]
。它得到的第一个结果包含除script标记之外的其他标记。是否有办法检查
loadHTML
DOMXPath
是否是罪魁祸首?谢谢Alvaro:)。这就解释了!