Не удается избавиться от появления пустого экрана при очистке содержимого

#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. Если я получу какой-либо документ в будущем, я постараюсь предоставить вам. Спасибо за ваше понимание.