Рекурсивная функция для поиска определенного тега ID на сайте - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь рекурсивно найти конкретный идентификатор на веб-сайте. Смотрите код ниже. Каждый раз, когда я запускаю, происходит сбой без сообщения об ошибке, и я не могу понять, почему или где происходит ошибка. Если я иду шаг за шагом, это не проблема (даже если он не нашел идентификатор, который ищет), хотя я думаю, что условие выхода правильное и это не бесконечный цикл.

Надеюсь, кто-то может мне помочь.

Public Function SetRecursiveInputFieldbyID(ByRef IE As Object, ByRef prevNode As Variant, ByRef ident As String) As Boolean
'    On Error GoTo error

    For Each t In prevNode.Document.ChildNodes
        If t.ID = ident Then
            Debug.Print "Found"
            SetRecursiveInputFieldbyID = True
            Exit For
        ElseIf t.ChildNodes.length <> 0 Then
            If t.ID <> "" Then Debug.Print t.ID
            If SetRecursiveInputFieldbyID(IE, t, ident) Then
                SetRecursiveInputFieldbyID = True
                Exit For
            End If
        End If
    Next t
    Exit Function

'error:
'    SetRecursiveInputFieldbyID = False
End Function

1 Ответ

0 голосов
/ 09 ноября 2019

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

Option Explicit
Public Sub test()
    Dim ie As InternetExplorer, ids(), i As Long

    Set ie = New InternetExplorer
    ids = Array("footer", "banana")

    With ie
        .Visible = True
        .Navigate2 "https://stackoverflow.com/"

        While .Busy Or .readyState <> 4: DoEvents: Wend

        For i = LBound(ids) To UBound(ids)

            If IdFound(.document, ids(i)) Then Debug.Print ids(i), vbTab, "Found"

        Next
        Stop
        '.Quit
    End With
End Sub

Public Function IdFound(ByVal document As htmlDocument, ByVal ident As String) As Boolean
    Dim node As Object
    Set node = document.querySelector("#" & ident & "")
    IdFound = Not node Is Nothing
End Function

Ссылки:

  1. Требуется ссылка на библиотеку объектов Microsoft HTML через VBE> Инструменты> Ссылки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...