【问题标题】:Excel/VBA - Using different QuerySelectors in loopExcel/VBA - 在循环中使用不同的 QuerySelector
【发布时间】:2020-02-10 12:53:49
【问题描述】:

我有一个问题,不同的网站需要不同类型的 QuerySelector(即GetElementsByClassNameGetElementsByTagNamequerySelectorAll 等)在循环中才能返回结果。

就目前而言,如果我在“Set list = html.querySelectorAll(ID)”行使用硬编码的 FIX SELECTOR,则此代码可用于检索网站信息,但如果我尝试使该代码不起作用它基于循环中的工作表行属性 query.name VARIABLE。

我不确定这是否只是分配了正确的变量类型,但我只是不知道如何处理使这部分工作......

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

任何帮助将不胜感激!

【问题讨论】:

  • 需要一些示例来说明您的 S、T、U 列单元格中的内容。你不能这样做html.TAG(ID),但如果不知道 TAG 中的内容,就很难提出建议。
  • 嘿,我已经更新了帖子,添加了一个示例,说明循环中一 (i) 行的外观。 TAG 代表“HTML DOM querySelector()”

标签: xml vba web-scraping queryselector


【解决方案1】:

我认为您正在尝试通过字符串变量调用方法,在这种情况下您需要 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]

【讨论】:

  • 我认为你在正确的轨道上 :) 就是说,你会怎么写,因为我不能单独声明“html”并放入“html”。抛出错误...?
  • 为您更新。试一试。
  • 我玩过更新的公式,它一直在崩溃 excel/vba(即没有响应)......我唯一的解决方法是一个 IF/ELSE IF 语句,然后它运行适当的“设置列表”..
  • 请在 bin.com 上粘贴指向导致崩溃的整个代码的链接。我上面的代码运行得很好。
  • 您好,您要粘贴链接吗?
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2023-03-29
相关资源
最近更新 更多