【问题标题】:VBA Web Scraping using getElementsByClassName to names and addressesVBA Web Scraping 使用 getElementsByClassName 获取名称和地址
【发布时间】:2019-08-16 14:28:30
【问题描述】:

我正在尝试从以下网页中提取所有诊所的诊所名称和相应地址:https://medimap.ca/Location/Calgary,%20AB,%20Canada

我在定位我应该深入钻探的确切区域时遇到问题。所有诊所名称都有相同的类名“_1FLG5”,地址都是“_1-Gov”。但是,当我运行下面的代码时,什么都没有发生 - 没有错误,什么都没有。

我也不确定 .getElementsByClassName 之后的引用是否正确,因为我想要与我引用“_1FLG5”的同一行中的内部文本 (0),因为我想要下面两行中的文本“ _1-Gov" 我引用了 (2)。

Option Explicit

Sub GetClinicData()

    Dim objIE As InternetExplorer
    Dim clinicEle As Object
    Dim clinicAdd As Object

    Dim clinicName As String
    Dim address As String
    Dim y As Integer
    Dim x As Integer

    Set objIE = New InternetExplorer
    objIE.Visible = False

    objIE.navigate "https://medimap.ca/Location/Calgary,%20AB,%20Canada"
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    y = 1

    For Each clinicEle In objIE.document.getElementsByClassName("_1FLG5")
        clinicName = clinicEle.getElementsByClassName("_1FLG5")(0).innerText
        Sheets("Sheet1").Range("A" & y).Value = clinicName
        y = y + 1
    Next

    x = 1

    For Each clinicAdd In objIE.document.getElementsByClassName("_1-Gov")
        clinicAdd = clinicAdd.getElementsByClassName("_1-Gov")(2).innerText
        Sheets("Sheet1").Range("B" & x).Value = clinicAdd
        x = x + 1
    Next


End Sub

【问题讨论】:

    标签: html excel vba web-scraping


    【解决方案1】:

    内容是动态加载的,因此您需要一个等待条件来确保加载内容 - 否则您的集合最终长度为 0。我使用 querySelectorAll 应用返回 nodeList 的类名 For Loop.Length的。理想情况下,您应该在循环中添加超时条件。我在这里显示一个定时loop

    Option Explicit
    
    'VBE > Tools > References: Microsoft Internet Controls
    Public Sub GetData()
        Dim ie As Object
        Set ie = CreateObject("InternetExplorer.Application")
        With ie
            .Visible = True
            .Navigate2 "https://medimap.ca/Location/Calgary,%20AB,%20Canada"
    
            While .Busy Or .readyState < 4: DoEvents: Wend
    
            Dim clinics As Object, addresses As Object, i As Long
            With .document
    
                Do
                    Set clinics = .querySelectorAll("._1FLG5")
                    Set addresses = .querySelectorAll("._1-Gov")
                Loop While clinics.Length = 0
    
                For i = 0 To clinics.Length - 1
                    With ThisWorkbook.Worksheets("Sheet1")
                        .Cells(i + 1, 1) = Trim$(clinics.item(i).innerText)
                        .Cells(i + 1, 2) = Trim$(addresses.item(i).innerText)
                    End With
                Next
            End With
            .Quit
        End With
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2021-12-05
      • 2016-06-29
      • 2022-01-08
      • 2021-10-15
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多