Не можете найти никакой логики, как неисправный скрипт работает безупречно? - PullRequest
0 голосов
/ 01 июля 2018

Я написал скрипт в vba, используя IE, чтобы получать названия различных названий отелей с веб-страницы. Названия отелей проходят через несколько страниц через нумерацию страниц.

Мой скребок может продолжать нажимать на следующую кнопку успешно, анализируя заголовки с каждой страницы, пока не останется больше щелчка, чтобы выполнить. Парсер делает это работа просто идеально. Все, что я хотел бы знать, - это простая логика, которую я спросил ниже.

Мой вопрос: как правильно просматривается содержимое каждой страницы, даже когда я не использовал эту строку Set Htmldoc = IE.document сразу после .click? Когда щелчок инициирован, скребок переходит на новую страницу с новым содержимым. Как получается, что он обновляется новым содержанием с каждой страницы, так как мой определенный do loop идет после блока with IE?

Это скрипт:

Sub GetTitles()
    Const Url As String = "https://www.tripadvisor.com/Hotels-g147237-Caribbean-Hotels.html"
    Dim IE As New InternetExplorer, Htmldoc As HTMLDocument, post As Object, R&

    With IE
        .Visible = True
        .navigate Url
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set Htmldoc = .document
    End With

    Do
        For Each post In Htmldoc.getElementsByClassName("listing") ''how this "Htmldoc" gets updated
            With post.getElementsByClassName("property_title")
                If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
            End With
        Next post

        If Not Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']") Is Nothing Then
            Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
            Application.Wait Now + TimeValue("00:00:05")

            ''I didn't use anything like "Set Htmldoc = IE.document" but it still works flawlessly 
        Else:
            Exit Do
        End If
    Loop
    IE.Quit
End Sub

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Сценарий не является неисправным. Тем не менее, вы используете его без полного понимания, это, безусловно, хлопотно.


Когда вы делаете это Set Htmldoc = .document, вы настраиваете документ IE для дальнейшего использования.

Когда вы делаете это, Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click javascript входит в игру и обновляет содержимое страницы (т. Е. Документ).

Вы можете верить, что документ изменился, но он только обновляется. На самом деле навигации вообще не происходит.


Добавьте следующее и посмотрите, как страница / документ остается прежней, меняется только содержимое.

            '/ Url before Next button click
            Debug.Print "Before Click " & Htmldoc.Url
            Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
            '/ Url after Next button click
            Debug.Print "After Click " & Htmldoc.Url

Поскольку заданный документ остается неизменным, а обновленное содержимое имеет ту же структуру / DOM (именно так программируют в основном программисты, наиболее вероятно, что все страницы отображаются с использованием шаблона ), следовательно, ваш код отлично работает Нетто-нетто для вашего цикла do, ничего не изменилось.

0 голосов
/ 01 июля 2018

Set Htmldoc = .document

получает указатель на DOM. Когда он меняется, Htmldoc указывает на новый контент. Нет необходимости делать новый набор Htmldoc

...