VBA Web Scraping с использованием getElementsByClassName для имен и адресов - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь извлечь название клиники и соответствующий адрес для всех клиник со следующей веб-страницы: 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

1 Ответ

1 голос
/ 01 июня 2019

Содержимое загружается динамически, поэтому вам нужно условие ожидания, чтобы обеспечить загрузку содержимого - в противном случае ваши коллекции в конечном итоге будут иметь длину 0. Я использую querySelectorAll, чтобы применить имена классов, которые возвращают nodeList вас For Loop вместо .Lengthиз.В идеале вы должны добавить условие цикла в цикл.Я показываю синхронизированную петлю здесь.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...