JavaScript: document.documentElement.innerHTML не показывает все элементы - PullRequest
3 голосов
/ 30 апреля 2019

Я пытаюсь выяснить, как получить все элементы HTML.Например, если я загружу этот поиск Google , я увижу этот результат:

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>

Ответы [ 4 ]

1 голос
/ 05 мая 2019

Я не смог воспроизвести вашу проблему, в моем случае исходный код выглядел точно так же, как document.documentElement.innerHTML.Итак, я не знаю, почему в этом конкретном примере у вас есть именно эта проблема.

Хотя исходный код страницы часто может не иметь никакого отношения к innerHTML документа.

innerHTML имеет как минимум 2 неточности:

  1. Показывает результат выполнения JS, который может изменить DOM.

Например, здесь у вас есть исходный код примера приложения React.

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

А вот вывод, который он производит:

React output

В этом случае источник полностью отличается от innerHTMLтак как мы генерируем новые вещи с помощью js.

Однако, было бы иначе, если бы мы изменили существующую разметку с помощью JS & Вероятно, это таксо страницей результатов Google.

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.

Со стороны сервера у вас наверняка найдется инструмент для выполненияПОЛУЧИТЬ запрос.Таким образом, вы можете использовать что-то вроде http.get в NodeJs или file_get_contents () в PHP.

0 голосов
/ 09 мая 2019

Возвращенный фрагмент HTML или XML создается на основе текущего содержимого элемента, поэтому разметка и форматирование возвращенного фрагмента, вероятно, не соответствуют исходной разметке страницы.

для более подробной информации

0 голосов
/ 06 мая 2019

Мне кажется, что определенная часть страницы динамически генерируется с помощью скрипта на стороне клиента, и что этот скрипт хранится на стороне сервера, отличной от Google.Поэтому вам, возможно, придется пройти через проблему с политикой CORS.Таким образом, «document.documentElement.innerHTML» будет показывать только статические элементы страницы, которые были изначально написаны для показа на стороне клиента, оставляя сценарий, который генерировал другие элементы динамически.

0 голосов
/ 03 мая 2019

HTML-теги Google намного сложнее, чем вы ищете, но я предполагаю, что вы хотите что-то вроде этого

x = document.querySelectorAll('.g')

x.forEach(function(element) {
    console.log(element.outerHTML);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...