GetElementsbyClassname: 打开IE和MSXML2方法

3
以下宏很好用。它打开了IE的实例并使用“getelementsbyclassname”方法返回了“my_rate”的预期值。然而,当我运行第二个宏使用“MSXML2”方法时,代码在注明的那一行失败,并出现“Run-time error 438: Object doesn't support this property or method”的错误。为什么“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 的库截图

输入图片说明


2
只要您的IE版本是9或以上,HTML对象库就应该可以正常工作。例如 Dim doc As HTMLDocument,然后在代码中稍后使用 Set doc = New HTMLDocument: doc.body.innerHTML = xml_obj.responseText。然后 Set el = doc.getelementsbyclassname("br-col-2 br-apr") 就可以正常工作了吗? - user688334
1
太好了,它起作用了!我进行了进一步的搜索,并发现这是一个已知的关于getElementsByClassName和MSXML2的早期绑定与晚期绑定问题。我的宏涉及晚期绑定,而你的方法涉及早期绑定;只有早期绑定才能起作用。 - ron
我将IE从IE7升级到IE11。现在getElementsByClassName可以正常工作了。 - Harsh Goyal
1个回答

2
错误信息十分明显: GetElementsByClassName 不是 Microsoft XML v6.0 库中可用的方法。
您可以在此处查看可用的方法: http://msdn.microsoft.com/en-us/library/aa926433.aspx 虽然我找不到类似的文档链接,但如果您启用对 MSHTML 库的引用,则可以在那里查看并确认同样不存在 GetElementsByClassName 方法。 这是仅适用于IE自动化而非HTML或DOMDocument的方法。
如图所示: enter image description here 更新 尽管这可能无法解决您的问题,但我将其放在这里以帮助其他使用 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列为成员。 - ron
嗯...好吧,我和你的版本/系统不同,所以可能无法提供进一步的帮助。 我相信他们在IE9+中添加了GetElementsByClassName。 (我正在使用8,所以我无法确认这一点)。即使是HTMLDocument的w3标准也未公开GetElementsByClassName方法:http://www.w3schools.com/jsref/dom_obj_document.asp。我添加了一张新的截图,上面有更多信息,你的是否与我的相同(我想知道您的HTMLDocument是否属于与MSHTML不同的库成员)。 - David Zemens
1
是的,我认为它们是同一个库。我编辑了我的问题并在底部放了一张截图。 - ron
抱歉我没有发布更新的截图。现在应该已经有了。请确保您可以看到MSHTML的Class HTMLDocument成员。 - David Zemens
也许是由于晚期绑定正在捕捉到旧版本? - user688334
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接