#excel #vba #web-scraping #internet-explorer-11
#excel #vba #очистка веб-страниц #internet-explorer-11
Вопрос:
Я создал макрос для анализа названий разных фильмов, проходящих по нескольким страницам торрент-сайта. Я использовал InternetExplorer
в сочетании с синтаксическим анализатором Html.body.innerHTML (обычно используется с запросами xmlhttp), чтобы ускорить выполнение. Хотя содержимое этого сайта не является динамическим, я использовал IE, чтобы посмотреть, как он ведет себя при очистке в сочетании с Html.body.innerHTML.
Когда я запускаю свой скрипт с помощью IE, он анализирует содержимое, как ожидалось, и завершает работу. Единственная проблема, с которой я сталкиваюсь, заключается в том, что в каждой разбивке на страницы из ниоткуда появляется пустой экран, подобный изображению ниже.
Как я могу избавиться от проблем с пустым экраном?
Мой скрипт (никаких проблем при использовании Html.body.innerHTML
в сочетании с драйвером Chrome):
Sub FetchContent()
Const link = "https://yts.am/browse-movies/0/all/action/0/latest?page="
Dim driver As New ChromeDriver, Html As New HTMLDocument, genre$
Dim post As HTMLDivElement, Iamp;, Ramp;
For I = 1 To 3
With driver
.AddArgument "--headless"
.get link amp; I
Html.body.innerHTML = .ExecuteScript("return document.documentElement.outerHTML")
End With
For Each post In Html.getElementsByClassName("browse-movie-bottom")
R = R 1: Sheets(1).Cells(R, 1) = post.getElementsByClassName("browse-movie-title")(0).innerText
Next post
Next I
driver.Quit
End Sub
Я хотел бы получить такое же поведение при попытке использования Html.body.innerHTML
в сочетании с IE, но оно выдает пустые экраны вместе с желаемым результатом:
Sub FetchContent()
Const link = "https://yts.am/browse-movies/0/all/action/0/latest?page="
Dim IE As New InternetExplorer, Html As New HTMLDocument, genre$
Dim post As HTMLDivElement, Iamp;, Ramp;
For I = 1 To 4
With IE
.Visible = False
.navigate link amp; I
While .Busy Or .readyState < 4: DoEvents: Wend
Html.body.innerHTML = .document.DocumentElement.outerHTML
End With
For Each post In Html.getElementsByClassName("browse-movie-bottom")
R = R 1: Sheets(1).Cells(R, 1) = post.getElementsByClassName("browse-movie-title")(0).innerText
Next post
Next I
IE.Quit
End Sub
Пустой экран, который появляется при каждой разбивке на страницы в случае IE
комбинации с Html.body.innerHTML
:
Комментарии:
1. Используйте
html.Write ie.Document.body.outerHtml
с последующимhtml.Close
. Создайте экземпляр IE с помощьюSet ie = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
и документа с помощьюSet html = CreateObject("new:{25336920-03F9-11CF-8FD0-00AA00686F13}")
.2. Мне безмерно приятно получить от вас какое-либо решение @Florent B.. Дело в том, что я с трудом могу реализовать предложенную вами часть в своем скрипте из-за своих неглубоких знаний. Тем не менее, я ценю, если вы не возражаете сделать это в качестве ответа. Спасибо.
Ответ №1:
Я пытаюсь протестировать ваш код с помощью IE и обнаруживаю, что могу устранить проблему.
Я обнаружил, что приведенная ниже строка вызывает эту проблему.
Html.body.innerHTML = .document.documentElement.outerHTML
Ниже приведена измененная версия вашего кода, в которой устранена эта проблема.
Sub FetchContent1()
Const link = "https://yts.am/browse-movies/0/all/action/0/latest?page="
Dim IE As New InternetExplorer, Html As New HTMLDocument, genre$
Dim post As HTMLDivElement, Iamp;, Ramp;
For I = 1 To 4
With IE
.Visible = False
.navigate link amp; I
While .Busy Or .readyState < 4: DoEvents: Wend
For Each post In .document.getElementsByClassName("browse-movie-bottom")
R = R 1: Sheets(1).Cells(R, 1) = post.getElementsByClassName("browse-movie-title")(0).innerText
Next post
End With
Next I
IE.Quit
End Sub
Вывод в IE 11:
Теперь он не откроет ни одной пустой страницы в IE.
Комментарии:
1. Я создал этот пост только для того, чтобы изучить использование
Html.body.innerHTML
в сочетании с IE. Итак, сохранение этогоHtml.body.innerHTML
является обязательным. Спасибо.2. Похоже, что назначение outerHTML для innerHTML вызывает эту проблему. Если вы хотите сохранить Html.body.innerHTML, попробуйте создать объект MSXML2.XMLHTTP. Смотрите первый пример кода по этой ссылке. codingislove.com/parse-html-in-excel-vba Другая ссылка на внутреннее свойство HTML. learn.microsoft.com/en-us/previous-versions/office/developer /…
3. Вы пытаетесь сравнить выполнение кода IE automation с драйвером Chrome. Что здесь не является справедливым сравнением. В IE вы сталкиваетесь с этой проблемой, и приведенное выше решение может помочь вам решить эту проблему.
4. Это, безусловно, справедливый вопрос, почему это можно сделать, в то время как порядок отсутствует, пока не будет очень веской причины. Тем не менее, я по этой причине . Вы пытаетесь помочь мне получить содержимое, но, к вашему сведению, я выучил то же самое пару лет назад @Deepak-MSFT. Спасибо.
5. Вы пытаетесь сравнить автоматизацию IE с драйвером Chrome. Chrome driver не является продуктом Microsoft и является продуктом третьей стороны. В рабочем механизме IE automation и Chrome Driver может быть много различий. В настоящее время отсутствует какая-либо информация или документация, которые могли бы объяснить, почему Html.body.innerHTML не работает с IE automation. Если я получу какой-либо документ в будущем, я постараюсь предоставить вам. Спасибо за ваше понимание.