【发布时间】:2018-12-21 23:12:15
【问题描述】:
我正在尝试下载一个站点以供离线查看,这需要我进行一些 DOM 操作(相信我,wget 只是没有做我需要做的事情......)。
我发现包含带有异常文本内容的标签的网页正在关闭 saveHTML。
对于某些 url,如果我使用 curl 读取页面并输出为
echo $contents;
那么一切都很好。
例如,页面的某个部分包含以下来源:
<div id="area2516" class="component interaction_component float-none clear-none ">
<div id="area2516">
<script type="text/javascript">
window.bm = window.bm || {};
bm.data = bm.data || [];
bm.data['area2516'] = {};
</script>
<link rel="stylesheet" type="text/css" href="/somecss.css">
<script type="text/javascript" src="somejs.js">
</script>
<script class="main-template" type="text/x-handlebars-template">
<div class="content_area">
<div class="bg_image cf"></div>
{{#each rollovers}}
<div class="rollover_content" style="left: {{x}}; top: {{y}}; display: none;" data-rollover-id="{{id}}">
{{{this.content}}}
</div>
{{/each}}
</div>
<div class="rollover_links">
<ul>
{{#each rollovers}}
<li>
<a class="rollover_link" href="#" data-rollover-id="{{id}}">
{{{link}}}
</a>
</li>
{{/each}}
</ul>
</div>
</script>
<script type="text/javascript">
bm.data['area2516'].assets = {};
bm.data['area2516'].initial_json = '';
</script>
从上面 curl 响应后的回声中可以看出。
现在,如果我这样做
$doc = new DOMDocument();
@$doc->loadHTML($contents);
$xpath = new DOMXpath($doc);
echo $doc->saveHTML();
HTML 搞砸了,所以上面现在变成了这样:
<div id="area2516" class="component interaction_component float-none clear-none ">
<div id="area2516">
<script type="text/javascript">
window.bm = window.bm || {};
bm.data = bm.data || [];
bm.data['area2516'] = {};
</script>
<link rel="stylesheet" type="text/css" href="/somecss.css"> .
<script type="text/javascript" src="/somejs.js"></script>
<script class="main-template" type="text/x-handlebars-template">
<div class="content_area">
<div class="bg_image cf">
</script>
</div>
{{#each rollovers}}
<div class="rollover_content" style="left: {{x}}; top: {{y}}; display: none;" data-rollover-id="{{id}}">
{{{this.content}}}
</div>
{{/each}}
</div>
<div class="rollover_links">
<ul>
{{#each rollovers}}
<li>
<a class="rollover_link" href="#" data-rollover-id="{{id}}">
{{{link}}}
</a>
</li>
{{/each}}
</ul></div>
<script type="text/javascript">
bm.data['area2516'].assets = {};
bm.data['area2516'].initial_json = '';
</script>
对不起,这个新编辑器很烦人。关键是,您可以看到一些相当大的差异,但我不确定 saveHTML 是如何导致对源代码进行修改的。我怀疑这与编码以及模板系统使用的这些双括号和三括号的特殊性有关,但是尽管尝试使用各种编码参数,但我得到了相同的结果。然后我想可能与特殊字符、转义有关,但我只是不确定需要什么函数来阻止 saveHTML 弄乱输出。
想法?
谢谢
【问题讨论】:
-
看起来很精简的 SPA JS 站点,可能运行 Vue - 我想我已经看到他们在模板上使用 Mustache 语法。幸运的是,模板引擎已被移植到基本上所有东西,你会发现它在这里:mustache.github.io
标签: php html dom domdocument