Search code examples
vbaweb-scrapinghtmlelements

Catching anchor element using SHDocVw.InternetExplorer


I want to catch the anchor element in website via vba.

I tried both as an MSHTML.IHTMLAnchorElement and MSHMTL.IHTMLBUttonELement but either way gives an error on Set line. Can anyone describe what's wrong with code below?

Sub goToWhtSpp()

    Dim ie As New SHDocVw.InternetExplorer
    
    ie.Visible = True
    ie.navigate "https://cooperatordirectory.com/"

    Do While ie.readyState <> READYSTATE_COMPLETE Or ie.Busy
    Loop

    Dim doc As MSHTML.HTMLDocument
        Set doc = ie.document
    Application.Wait 3000
    
    URL = "https://cooperatordirectory.com/search_results?location_value=Florida&adm_lvl_1_sn=FL&stateSearchLN=Florida&country_sn=US&location_type=administrative_area_level_1&stateSearch=FL&swlat=24.396308&nelat=31.000968&swlng=-87.634896&nelng=-79.974306&lat=27.6648274&lng=-81.5157535&faddress=Florida%2C+USA&place_id=ChIJvypWkWV2wYgR0E7HW9MTLvc"
    ie.navigate URL


Dim aelement As MSHTML.IHTMLAnchorElement
Set aelement = doc.getElementsByClassName("btn btn-primary btn-block") ' err line

Dim btn As MSHTML.IHTMLButtonElement
Set btn = doc.getElementsByClassName("btn btn-primary btn-block") ' err line
Debug.Print btn.Value
End Sub


<a class="btn btn-primary btn-block" href="/pro/20220324090906/connect">Send Message</a>

Solution

  • You want a page load wait after each .navigate. In this case you only need the one .navigate and wait.

    getElementsByClassName() returns a collection not a single node. So both your type declaration, subsequent SET attempt to this type, and later attempt to view the .value attribute will fail. .value is a property of a single node.

    If you want the first "button" href then index into a correctly typed variable and call .item(0), or, more efficiently, use the querySelector() method of ie.document and pass in a single class of the multi-valued class (the one which still correctly identifies the target element).


    Dim anchors As IHTMLElementCollection
    Set anchors = .document.getElementsByClassName("btn-primary")
    
    Dim anchor As IHTMLAnchorElement
    Set anchor = .document.getElementsByClassName("btn-primary").Item(0)
    

    Option Explicit
    
    Public Sub PrintMessageUrl()
        
        Const URL As String = "https://cooperatordirectory.com/search_results?location_value=Florida&adm_lvl_1_sn=FL&stateSearchLN=Florida&country_sn=US&location_type=administrative_area_level_1&stateSearch=FL&swlat=24.396308&nelat=31.000968&swlng=-87.634896&nelng=-79.974306&lat=27.6648274&lng=-81.5157535&faddress=Florida%2C+USA&place_id=ChIJvypWkWV2wYgR0E7HW9MTLvc"
        Dim ie As SHDocVw.InternetExplorer
        
        Set ie = New SHDocVw.InternetExplorer
    
        With ie
            .Visible = True
            .navigate URL
            Do While .readyState <> READYSTATE_COMPLETE Or .Busy: DoEvents: Loop
            Debug.Print .document.querySelector(".btn-primary").href
            .Quit
        End With
    
    End Sub