VBA Web Scraper: возникают проблемы с активацией кнопки поиска с помощью .Click - PullRequest
0 голосов
/ 01 ноября 2018

Надеюсь, это действительно простой вопрос. Я использую IE11 с активированными ссылками HMTL Object Library и Internet Controls. Я не очень хорошо разбираюсь в VBA, поэтому в моем коде может быть много шума.

На кнопке нет идентификатора элемента, но я могу использовать ie.Document.getElementsByClassName, добавив некоторые объявления html и xml благодаря этому сообщению . Я беру имя и город, штат из Excel и подключаю его к веб-сайту, затем нажимаю кнопку поиска, но здесь происходит моя ошибка. Классическая ошибка времени выполнения '438': Object doesn't support this property or method. Есть идеи, как исправить и двигаться дальше?

HTML: enter image description here

VBA:

Option Explicit
Sub HGScrape()

'Application.ScreenUpdating = False

 'we define the essential variables
 Dim ie As Object
 Dim my_url As String
 Dim SearchButton, NameBox, AddressBox
 Dim ele As Object
 Dim x As Integer
 Dim y As Integer
 Dim IsOdd As Integer

 Dim html_doc As Object 'HTMLDocument
 Dim xml_obj As Object 'MSXML2.DOMDocument

 my_url = "https://www.healthgrades.com/"


'add the "Microsoft Internet Controls" reference in your VBA Project indirectly
 Set ie = New InternetExplorer
     ie.Visible = True 'False ''''''''''''''''''''''
     ie.Navigate my_url '"13.33.74.92"     '("https://www.healthgrades.com/")
     While ie.ReadyState <> 4
         DoEvents
     Wend

     Set NameBox = ie.Document.getElementById("search-term-selector-child")
     NameBox.Value = ActiveSheet.Range("A2")

     Set AddressBox = ie.Document.getElementById("search-location-selector-child")
     AddressBox.Value = ActiveSheet.Range("B2")

     Set html_doc = CreateObject("htmlfile")
     Set xml_obj = CreateObject("MSXML2.XMLHTTP")

     xml_obj.Open "GET", my_url, False
     xml_obj.send
     html_doc.body.innerHTML = xml_obj.responseText

     Set SearchButton = ie.Document.getElementsByClassName("autosuggest_submiter") 'id of the button control (HTML Control)
     SearchButton.Click
     While ie.ReadyState <> 4
         DoEvents
     Wend

1 Ответ

0 голосов
/ 01 ноября 2018

Я немного сжал твой код. Вам действительно не нужно устанавливать каждый элемент в переменную. Это просто тратит впустую ресурсы в долгосрочной перспективе.

Используйте ClassName submiter__text, чтобы получить кнопку отправки, и ее индекс равен 0.

Sub HGScrape()

    Const sURL As String = "https://www.healthgrades.com/"

    Dim ie As New InternetExplorer

    With ie

        .Visible = True
        .Navigate sURL
        While .Busy Or .ReadyState < 4: DoEvents: Wend
        .Document.getElementById("search-term-selector-child"). _
                    Value = ActiveSheet.Range("A2")
        .Document.getElementById("search-location-selector-child"). _
                    Value = ActiveSheet.Range("B2")
        .Document.getElementsByClassName("submiter__text")(0).Click
        While .Busy Or .ReadyState < 4: DoEvents: Wend

    End With

End Sub

".. Почему класс" submitter_text "был правильным?"

Лучший способ объяснить это - показать вам. Если вы не уверены, какой выбор сделать, щелкните правой кнопкой мыши элемент и выберите «Проверить элемент» и осмотрите выделенную строку.

enter image description here

...