【问题标题】:GetElementsbyClassname: Open IE vs. MSXML2 MethodsGetElementsbyClassname:打开 IE 与 MSXML2 方法
【发布时间】:2014-05-05 15:41:42
【问题描述】:

以下宏可以正常工作。它打开一个 IE 实例并使用“getelementsbyclassname”方法返回“my_rate”的预期值。但是,当我运行使用“MSXML2”方法的第二个宏时,宏在所指出的行上失败,并出现“运行时错误 438:对象不支持此属性或方法”错误。为什么“Open IE”方法有效,但“MSXML2”方法因我的代码而失败?我正在使用 IE 11 运行。我还为第二个宏设置了对 Microsoft HTML 对象库的引用,但它似乎没有什么不同。提前感谢您向我解释这一点。

Sub BankRate_Rate_Retrieval()
    my_url = "http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?market=321&loan=150000&perc=20&prods=2&points=0"   
    Set ie = CreateObject("InternetExplorer.Application")

    With ie
        .Visible = True
        .Navigate my_url
        .Top = 50
        .Left = 530
        .Height = 400
        .Width = 400
    End With

    Do Until Not ie.Busy And ie.readyState = 4
        DoEvents
    Loop

    my_rate = ie.Document.getelementsbyclassname("br-col-2 br-apr")(1).getElementsByTagName("div")(0).innertext
End Sub


Sub BankRate_Rate_Retrieval()
    my_url = "http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?market=321&loan=150000&perc=20&prods=2&points=0"
    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 xml_obj = Nothing

    my_rate = html_doc.body.getelementsbyclassname("br-col-2 br-apr")(1).getElementsByTagName("div")(0).innertext

' 运行时错误 438:对象不支持此属性或方法出现在上面的行

结束子

编辑:D. Zemens 的库截图

【问题讨论】:

  • 只要您有 IE9+,HTML 对象库就应该可以工作。例如Dim doc As HTMLDocument,然后是代码Set doc = New HTMLDocument: doc.body.innerHTML = xml_obj.responseText。那么Set el = doc.getelementsbyclassname("br-col-2 br-apr") 应该可以吗?
  • 宾果游戏,行得通!我做了一些进一步的搜索,发现这是 getElementsByClassName 和 MSXML2 的一个已知的早期与晚期绑定问题。我的宏涉及后期绑定,您的方法涉及早期绑定;只有伯爵装订作品
  • 我将 IE 从 IE7 更新到 IE11。现在 getElementsByClassName 可以工作了。

标签: vba internet-explorer excel getelementsbyclassname


【解决方案1】:

错误信息非常简单:

GetElementsByClassName 不是 Microsoft XML v6.0 库中可用的方法。

您可以在此处查看可用的方法:

http://msdn.microsoft.com/en-us/library/aa926433.aspx

虽然我找不到类似的文档链接,但如果您启用对 MSHTML 库的引用,您可以在那里查看以同样确认,没有 GetElementsByClassName 方法。这是一种适用于 IE 自动化但不适用于 HTML 或 DOMDocument 的方法。

更新

虽然这可能无法解决您的问题,但我将其放在这里以防其他人使用 IE8。它似乎可以用于此目的,但可能需要改进。

Option Explicit

Sub BankRate_Rate_Retrieval()
Dim my_url As String
Dim html_doc As Object 'HTMLDocument
Dim xml_obj As Object 'MSXML2.DOMDocument
Dim my_rate As String

my_url = "http://www.bankrate.com/funnel/mortgages/mortgage-results.aspx?market=321&loan=150000&perc=20&prods=2&points=0"

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

'attempt to replicate the GetElementsByClassName for IE8

my_rate = IE8_GetElementsByClassName(html_doc.body, "br-col-2 br-apr", 1).GetElementsByTagName("div")(0).InnerText

MsgBox my_rate


Set xml_obj = Nothing
Set html_doc = Nothing


End Sub

Function IE8_GetElementsByClassName(html As Object, className As String, Optional Position As Integer)
'Function to return an array of matching classname elements
' or if specified will return a single HTMLElement by Position index

Dim eleDict As Object
Dim ele as Variant
Set eleDict = CreateObject("Scripting.Dictionary")
For x = 0 To html.all.Length - 1
    Set ele = html.all(x)
    If ele.className = className Then
        'Debug.Print i & vbTab & x & vbTab & ele.InnerText
        Set eleDict(i) = ele
        i = i + 1
    End If
Next

If Position = Empty Then
    IE8_GetElementsByClassName = eleDict.Items
Else
    Set IE8_GetElementsByClassName = eleDict(Position)
End If
Set eleDict = Nothing
End Function

【讨论】:

  • 我的 HTML 文档类将 getElementsByClassName 列为成员。
  • 嗯……嗯,我和你不在同一个版本/系统上,所以我可能无法提供进一步的帮助。我相信他们在 IE9+ 中添加了 GetElementsByClassName。 (我使用的是 8,所以我无法确认)。即使是 HTMLDocument 的 w3 标准也没有公开 GetElementsByClassName 方法:w3schools.com/jsref/dom_obj_document.asp 我添加了一个包含更多信息的新屏幕截图,您的是否相同(我想知道您是否有一个 HTMLDocument,它是与 MSHTML 不同的库的成员)。
  • 是的,我认为它们是同一个库。我编辑了我的问题并在底部放了一个屏幕截图
  • 对不起,我没有发布更新的截图。它现在应该在那里。确保您可以看到 MSHTML 的 Class HTMLDocument 成员。
  • 是的,它们是同一个库
猜你喜欢
  • 2014-03-07
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2017-06-16
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多