【问题标题】:Getting object error when getting getElementById value on webpage在网页上获取 getElementById 值时出现对象错误
【发布时间】:2018-10-11 18:11:12
【问题描述】:

我正在自动化网页抓取,但我收到一个对象错误 438 对象不支持此属性或方法。当我到达最后一行代码时,在 vba 中。如果我在 Internet Explorer 控制台上运行它,我会得到值,但在 vba 中会出错。有什么帮助吗?

  Dim shellWins As ShellWindows
  Dim IE As Object

  Set shellWins = New ShellWindows

  If shellWins.Count > 0 Then
    ' Get IE
    Set IE = shellWins.Item(0)
  Else
    ' Create IE
    Exit Sub
  End If    
        
  IE.Navigate "https://mywebpage.com"
  While IE.Busy
      DoEvents
  Wend
  Do Until IE.ReadyState = 4
      DoEvents
  Loop
  Dim rtn As String
        
  rtn = IE.getElementById("myID").getAttribute("value") << I get ERROR here

【问题讨论】:

    标签: html vba web web-scraping


    【解决方案1】:

    我在this comment看到你的问题,

    有没有办法将对象设置为已经存在的 IE 实例?

    因此,您可以执行以下操作来获取现有的 IE 浏览器:

    Dim IE As Object
    Set IE = GetIE("https://mywebpage.com")
    

    Function GetIE(sLocation As String) As Object
    
        Dim objShell As Object, objShellWindows As Object, o As Object
        Dim sURL As String
        Dim RetVal As Object
    
        Set objShell = CreateObject("shell.application")
        Set objShellWindows = objShell.Windows
    
        For Each o In objShellWindows
            sURL = ""
            On Error Resume Next
            sURL = o.document.Location
            On Error GoTo 0
            If sURL Like "*" & sLocation & "*" Then
                Set RetVal = o
                Exit For
            End If
        Next o
    
        Set GetIE = RetVal
    
    End Function
    

    现在回到实际问题。如果不查看 HTML 代码或网站本身,就不可能准确地帮助您。

    但是,您可以尝试这些属性中的任何一个,看看它们是否有效(按此处列出的顺序尝试):

    Dim rtn As String
    rtn = IE.Document.getElementById("myID").Value
    

    Dim rtn As String
    rtn = IE.Document.getElementById("myID").innerText
    

    Dim rtn As String
    rtn = IE.Document.getElementById("myID").outerText
    

    【讨论】:

    • 我想通了,但这也可以...谢谢
    【解决方案2】:

    该方法是 .document (HTMLDocument) 对象而不是 IE 对象的属性

    IE.document.getElementById("myID")
    

    创建 IE 实例:

    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    

    【讨论】:

    • 你建议如何获取IE对象方法?
    • 如果需要,您可以创建 IE 实例并循环将其设置到正确的窗口。
    • 我不想再创建一个实例,我需要使用已经打开的IE的实例。
    • 1) 我已经按照说明回答了这个问题,因此您应该提出一个新问题,以便循环打开 IE 窗口以查找特定窗口。 SO上有示例,所以如果您在识别正确的MCVE时遇到问题,请创建一个MCVE并发布它2)我已经添加了一个,因为它在您上面的代码中不可见。
    【解决方案3】:

    同意上面的一些答案。下车 IE,除非它是一个约束。

    您根本没有创建 IE 对象。所以你试图使用一个不存在的对象。

    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    

    【讨论】:

      【解决方案4】:

      首先:不要使用IE。 Firefox 和 Chrome 更可行,并且实际上是 HTML comformant。

      如果这不能解决问题:此外,如果您的脚本在启动时运行并在 HTML 之前声明,它将尝试搜索当前缓冲区并且不会找到该对象,因为它尚未加载。尝试将脚本放在 HTML 声明之后。

      如果我误解了上面的代码,我很抱歉,因为我实际上不会说 VB ^^'

      【讨论】:

      • 这个答案到底如何?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2018-12-27
      • 2021-08-10
      相关资源
      最近更新 更多