2

假设我有一些 javascript 代码,它从 php 传递了一个包含整个 html 页面的字符串。我将字符串写入当前文档,然后更改其中一个包含元素。像这样的东西:

<script type="text/javascript">
var foo = <?php echo $html_document;?>;
document.open();
document.write(foo);
document.close();
document.getElementById("some_id_within_html_document").innerHTML = "some stuff";
</script>

这给了我我想要的输出,一切看起来都很棒......除非您查看此页面的源代码。如果我想稍后抓取这个页面并做同样的事情,它会显示 javascript 而不是浏览器解释的 html。使用这种方法我怎么能抓取所需的 HTML 而不是 javascript 生成它?我已经通过在 php 中处理字符串来规避这个问题,但是我仍然很好奇在查看源代码/抓取页面时是否可以以这种方式显示解释的 HTML。

编辑:全面的反应很好,我学到了很多关于这里实际发生的事情以及我应该远离的做法。Justin Wood 给出了与我最初的问题相关的最简单的解决方案。

4

4 回答 4

3

不完全确定您要做什么,但您可以使用以下内容查看与生成/修改的 DOM 等效的 HTML:

document.documentElement.innerHTML

或者:

document.getElementById("some_id").innerHTML

演示

您可以创建一个包含此代码的书签:

alert(document.documentElement.innerHTML);

在您查看的每个页面上查看由 JavaScript 修改的 DOM 的 HTML。

更新:

如果你想在你的服务器上做一些网页抓取,你想下载一些外部网页,执行它的 JavaScript,然后在 JavaScript 执行后查看与 DOM 对应的 HTML(使用 document.write 调用和所有这些)然后尝试使用ZombiePhantom。另请参阅Mink以获取支持 Zombie 的 PHP 工具。

一般搜索带有 JavaScript 引擎的无头浏览器。

与人们在此处的其他答案中所写的相反,实际上是可能的。

于 2012-10-03T00:28:23.027 回答
1

你没有。HTML 不在源代码中,句号。原始 HTML 包含需要执行的 Javascript。该 Javascript 操作页面的 DOM 以向其中添加更多内容。原始的 HTML 没有改变,它仍然只有 Javascript。

如果您想“抓取”Javascript 生成的内容,您总是需要解析和执行包括 Javascript 和 DOM 在内的整个页面,并评估生成的更改后的 DOM。

于 2012-10-03T00:08:02.627 回答
1

不要将您的 PHP 变量传递给 javascript。只需输出变量本身,然后使用 javascript 编辑您要编辑的任何内容...

<?php
$html = "<html><head><title></title></head><body><p id='p'>Something</p></body></html>";

echo $html;
?>

<script type="text/javascript">
  document.getElementById("p").innerHTML = "blah";
</script>

像这样的东西应该适合你。

注意:我只在 chrome、FF 和 safari 中测试过这个

于 2012-10-03T00:13:04.673 回答
0

由于 JavaScript 是一种客户端语言,当您查看页面的源代码时它不会被执行,因此视觉结果与源代码之间的差异。您必须用 PHP 或其他服务器端语言替换 JS 才能获得相同的结果。

此外,如果您仍想使用 JavaScript,则必须在 JavaScript 执行后查看包含所有 HTML 节点的 DOM 或文档对象。一种方法是使用 Chrome 中的检查器(CTRT + SHIFT + I)或(右键单击 -> 检查此元素)。

于 2012-10-03T00:08:23.427 回答