JavaScript:document.documentElement.innerHTML 未显示所有元素

标签 javascript html dom

我正在尝试弄清楚如何获取 html 的所有元素。例如,如果我加载这个 google search ,我会看到这个结果:

enter image description here

查看页面特定部分的源代码,我看到了这个:

<a href="https://www.macworld.com/article/3331839/iphone-2019-rumors-everything-you-need-to-know.html" onmousedown="return rwt(this,'','','','38','AOvVaw07dY5FgPEzcYsd8enm-9gs','','2ahUKEwicoNi4yPjhAhVdCTQIHVxICj4QFjAlegQIABAB','','',event)">
<h3 class="LC20lb">iPhone 2019 rumors: Everything you need to know | Macworld</h3><br><div class="TbwUpd">
<cite class="iUh30">https://www.macworld.com/.../iphone-2019-rumors-everything-you-need-to-know.ht...</cite></div></a>

但是如果我使用 document.documentElement.innerHTML,我会看到:

<div class="g"><h3 class="r">
<a href="/url?q=https://www.macworld.com/article/3331839/iphone-2019-rumors-everything-you-need-to-know.html&amp;sa=U&amp;ved=0ahUKEwiU__rUy_jhAhWIHzQIHTrGBzIQFghLMAo&amp;usg=AOvVaw2C3PdwxIaeNuukMVSwC-5g">
<b>iPhone 2019</b> rumors: Everything you need to know | Macworld</a>
</h3><div class="s"><div class="hJND5c" style="margin-bottom:2px">

我的问题:为什么源代码和 document.documentElement.innerHTML 的输出之间存在差异?

此外,使用 JavaScript 时它看起来像这样:

<a href="https://www.macworld.com/article/3331839/iphone-2019-rumors-everything-you-need-to-know.html" onmousedown="return rwt(this,'','','','38','AOvVaw07dY5FgPEzcYsd8enm-9gs','','2ahUKEwicoNi4yPjhAhVdCTQIHVxICj4QFjAlegQIABAB','','',event)">
<h3 class="LC20lb">iPhone 2019 rumors: Everything you need to know | Macworld</h3><br><div class="TbwUpd">
<cite class="iUh30">https://www.macworld.com/.../iphone-2019-rumors-everything-you-need-to-know.ht...</cite></div></a>

最佳答案

我无法重现您的问题,在我的例子中,源代码显示与 document.documentElement.innerHTML 完全相同。所以,我真的不知道为什么在这个特定的例子中你有这个特定的问题。

尽管如此,页面的源代码通常可能与文档的 innerHTML 无关。

innerHTML 至少有 2 个错误:

  1. 它显示了可能修改 DOM 的 JS 执行结果。

例如,这里有一个示例 React 应用程序的源代码。

<body>
  <div id="app"></div>
  <script src="main.js"></script>
</body>

这是它产生的输出:

React output

在这种情况下,源代码与 innerHTML 完全不同,因为我们生成新的东西是用 js。

但是,如果我们用 JS 修改现有标记,情况也会有所不同,Google 的结果页面很可能就是这种情况。

  1. innerHTML 显示浏览器解析的内容,而不是从服务器发送的内容。

例如,如果我像这样从服务器发送了错误的 HTML:

<head>...</head>
<!DOCTYPE html>
<html lang="en">
   <body>...</body>
</html>

然后 document.documentElement.innerHTML 会像这样很好地输出我的错误标记:

<head>...</head>
<body>...</body>

这可能不会影响 Google 的页面,但当您基于文档的 innerHTML 构建某些内容时,它也值得考虑。

因此,如果您真正想要的是页面的源代码,您可能只需要直接从服务器获取它并从响应中获取文本即可。

在客户端 JS 中,您可以使用 fetch API 来做到这一点.唯一的问题是您可能无法从不同于 google.com 的来源执行此操作,因为您可能会遇到 CORS 策略问题。

从服务器端,您肯定会有一个工具来执行 GET 请求。因此,您可能会在 NodeJs 中使用 http.get 或在 PHP 中使用 file_get_contents() 之类的东西。

关于JavaScript:document.documentElement.innerHTML 未显示所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55927984/

相关文章:

javascript - 这种情况下 XSS 可能吗?

HTML 表格 : Set width of column to fit floating content

java - 使用 DOM 选择节点的所有子节点

javascript - 如何使用 html 标记包装来自 window.getSelection().getRangeAt(0) 的文本选择?

jquery - 如何使用jquery将dom对象构建到html中

javascript - React Context API 和避免重新渲染

javascript - 如何在 JavaScript 中显示双引号

javascript - 如何删除数据表上的文本 "entries"

javascript - Angular JS函数未定义错误

javascript - 不要滑动切换所有