【问题标题】:Activating a search button via .Click通过 .Click 激活搜索按钮
【发布时间】:2019-04-06 02:56:15
【问题描述】:

我正在使用 IE11 并激活了 HMTL 对象库和 Internet 控件引用。

按钮上没有元素 ID,但可以通过添加一些 html 和 xml 声明来使用ie.Document.getElementsByClassName,这要感谢this post

我从 Excel 中获取名称和城市、州并将其插入网站,然后单击搜索按钮。

这是我的错误发生的地方。

运行时错误“438”:对象不支持此属性或方法。

HTML:

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

【问题讨论】:

  • 你能试试ie.document.forms(0).Submit吗?
  • 您说您引用了 MS Internet 控件和 MS HTML Obj 库 - 但您仍然将变量声明为 As Object 类型?
  • 好像刚刚刷新了页面
  • 好的,我去看看
  • 这篇文章使用excel-vba标签,即pending removalshould be replaced by excelvba。但由于它已经达到了 5 个标签的限制,如果不删除至少一个其他标签,就不可能建议编辑...

标签: html excel vba web-scraping getelementsbyclassname


【解决方案1】:

我稍微压缩了你的代码。您确实不需要将每个元素都设置为变量。从长远来看,这只会浪费资源。

使用 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" 类是正确的?"

最好的解释方式就是展示给你看。如果您不确定要进行什么选择,请右键单击该元素并选择“检查元素”并查看突出显示的行。

【讨论】:

  • 比我拥有的更简单!为什么“submitter_text”类是正确的?
  • 通常,您想要的按钮元素不会有任何子元素。这意味着,如果您的元素有一个下拉箭头,那么您还远远不够。
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多