Excel / VBA - Использование разных QuerySelectors в цикле - PullRequest
0 голосов
/ 13 октября 2019

У меня проблема с тем, что разные сайты требуют разных типов QuerySelector (т.е. GetElementsByClassName, GetElementsByTagName, querySelectorAll и т. Д.) В цикле, чтобы иметь возможность вернуть результат.

В своем нынешнем виде этот код РАБОТАЕТ для получения информации о веб-сайте, если я использую жестко заданный FIX SELECTOR в строке «Set list = html.querySelectorAll (ID)», но он НЕ РАБОТАЕТ, если япопробуйте сделать его переменным, основываясь на строке листа с атрибутом query.name в цикле.

Я не уверен, что это просто назначение правильного типа переменной, но я просто не знаю, как справиться с этой частью работы ...

Sub FETCHER()
    Dim URL As String, tag As String, ID As String, LastRow As Integer, j As Long
    Dim html As HTMLDocument, list As Object, i As Long

    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("MSXML2.XMLHTTP.6.0")
    'CreateObject("WINHTTP.WinHTTPRequest.5.1")

    Worksheets("TEST").Activate
    LastRow = Range("C" & Rows.Count).End(xlUp).Row

    For j = 2 To LastRow
        With ActiveSheet
            URL = Range("S" & j).Text            'URL = https://stackoverflow.com/
            tag = Range("T" & j).Text            'TAG = getElementsByClassName '<--- Where I want to assign the selector type (i.e. getelementsbyclassname, getelementsbytagname, etc.)
            ID = Range("U" & j).Text             'Element ID = "CONTENT"
        End With

        Set xmlhttp = New MSXML2.XMLHTTP60
        Set html = New HTMLDocument

        With xmlhttp
            .Open "GET", URL, False
            .setRequestHeader "User-Agent", "Chrome/39.0.2171.95"
            .Send

            html.body.innerHTML = .responseText
        End With

        'Set list = html.querySelectorAll("CONTENT")   <---Example..
        Set list = html.querySelectorAll(ID)          '<---This WORKS as it's HARD-CODED
        Set list = html.TAG(ID)                       '<---This DOESN'T WORK in trying to make it VARIABLE

        For i = 0 To 5
            With ActiveSheet
                .Cells(j, 22 + i) = list.Item(i).innerText
                '.Cells(j + 1, 22 + 1) = list.Item(i).getAttribute("href")
            End With
        Next
    Next
End Sub

Любая помощьс благодарностью!

1 Ответ

1 голос
/ 14 октября 2019

Я думаю, что вы пытаетесь вызвать метод с помощью строковой переменной, в этом случае вам нужно CallByName, например,

Option Explicit
Public Sub test()
    Dim xmlhttp  As MSXML2.XMLHTTP60
    Dim html As MSHTML.HTMLDocument

    Set xmlhttp = New MSXML2.XMLHTTP60
    Set html = New MSHTML.HTMLDocument

    With xmlhttp
        .Open "GET", "https://stackoverflow.com/", False
        .setRequestHeader "User-Agent", "Chrome/39.0.2171.95"
        .send
        html.body.innerHTML = .responseText
    End With

    Dim tag As String, list As Object

    tag = "GetElementsByTagName"
    Set list = CallByName(html, tag, VbMethod, "a") '<==note the args at end e.g. here the element type selector of "a" for a tag elements.
    Debug.Print list.Length
End Sub

Вы не можете использовать object.[string variable for method]

...