【问题标题】:Get ticker price within html class issue. Creating a stock ticker through InternetExplorer.application在 html 类问题中获取股票价格。通过 InternetExplorer.application 创建股票代码
【发布时间】:2014-10-16 03:13:31
【问题描述】:

我正在尝试创建自己的股票价格。现在我正在尝试获取指数和信托基金的股票价格,这会使事情变得复杂。我想访问以下网址的股票价格:https://www.avanza.se/fonder/om-fonden.html/313047/norron-active-r

现在的问题是 180,05(在“NAV-kurs”下)的票价,它在 HTML 类“SText 粗体”下(右键单击价格并选择视图组件)。

我可以通过 yahoo Finance 通过 getelementbyid 做个股,但我如何访问 HTML 类的内部文本?我找不到任何与我尝试过的 getelementbyclassname 相关的属性。

代码如下

Private Sub get_ticker()

Dim ie_app As InternetExplorer
Dim ie_doc As htmldocument
Dim ticker As String

Set ie_app = CreateObject("internetexplorer.application")

ie_app.Visible = True
ie_app.navigate ("https://www.avanza.se/fonder/om-fonden.html/313047/norron-active-r")

Do Until ie_app.readyState = READYSTATE_COMPLETE
    DoEvents
Loop

Set ie_doc = ie_app.document

ticker = ie_doc.getelement <<---- gaah 
Debug.Print ticker



End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    如果您完全不愿意使用 Javascript,您可以尝试类似的方法。

    注意:此代码依赖于早期绑定,并且需要在您的引用中勾选 Microsoft XML (v6.0) 和 Microsoft HTML 对象库。

    Sub getPrice()
    
        Dim xhr As MSXML2.XMLHTTP60
        Dim doc As MSHTML.HTMLDocument
        Dim XSText As MSHTML.IHTMLElementCollection
        Dim elt As MSHTML.HTMLDivElement
        Dim parentElt As MSHTML.HTMLLIElement
        Dim myPrice As Single
    
        Set xhr = New MSXML2.XMLHTTP60
    
        With xhr
            .Open "GET", "https://www.avanza.se/fonder/om-fonden.html/313047/norron-active-r", False
            .send
    
            If .readyState = 4 And .Status = 200 Then
                Set doc = New MSHTML.HTMLDocument
                doc.body.innerHTML = .responseText
            Else
                MsgBox "xhr error"
                Exit Sub
            End If
        End With
    
        set xhr = Nothing
    
        Set XSText = doc.getElementsByClassName("XSText")
    
        For Each elt In XSText
            If InStr(elt.innerHTML, "NAV SEK") <> 0 Then
                Set parentElt = elt.parentElement
                myPrice = CSng(parentElt.getElementsByClassName("SText bold")(0).innerHTML)
            End If
        Next
    
        MsgBox myPrice
    
    End Sub
    

    【讨论】:

    • 因此无法通过getelementsclassname获取价格?
    • 它是 - 你可以做 myPrice = doc.getElementsByClassName("SText bold")(0).innerHTML。但是,如果您想要更一致、可靠可重复的代码,通常建议根据 html 页面的结构和不同感兴趣元素的相对位置来制定更好的逻辑。
    • 您好,我一直在查看您的代码,请问 MSXML2.XMLHTTP.Open 下的错误语句究竟是做什么的?我正在阅读 MSDN,它说: varAsync[optional] 调用是否异步的布尔指标。默认值为 True(调用立即返回)。如果设置为 True,则附加一个 onreadystatechange 属性回调,以便您可以知道发送调用何时完成。 .send和.open下的虚假陈述有什么关系吗?
    • 是的,同步性是指代码执行与作为 HTTP 请求的一部分发生的服务器交换有关的行为。具体来说,一旦发送了请求,可以告诉代码执行停止,直到从服务器接收到响应 - 这是同步方式,Open 方法的 Async 参数设置为 False。这具有在收到响应之前冻结代码执行的缺点,因此您无法在请求和响应接收之间执行任何指令,但在 VBA 中具有简单性的优点。
    • 如果你采用异步方式,那么代码执行永远不会停止,一旦发送指令被执行就会跳转到下一条指令——不管服务器响应的状态如何。但是,您需要建立机制来监控服务器响应并在它到达后捕获它。这基本上是使用事件来实现的。看这里dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls
    【解决方案2】:

    Cheat - 该页面包含 jQuery,它更适合用于选择没有 ID 的元素,例如告诉它寻找包含 XSTextXSText 类的 divdiv.XSText:contains('NAV SEK') 并阅读下一个元素的文本:

    ...
    Set ie_doc = ie_app.Document
    
    ''Create a new element in the document we can read from:
    Dim tempInput As HTMLInputElement
    Set tempInput = ie_doc.createElement("input")
    tempInput.Type = "hidden"
    tempInput.ID = "tempInput"
    
    '' add it to the document
    ie_doc.appendChild tempInput
    
    '' use jQuery to lookup the value and assign it to the temp input
    ie_doc.parentWindow.execScript("$('#tempInput').val($( ""div.XSText:contains('NAV SEK')"" ).next().text())")
    
    '' read the value
    msgbox tempInput.Value
    

    【讨论】:

    • 非常有帮助。虽然我想专注于 VBA,因为我对编程很陌生。你的代码是纯 VBA 还是 VBA + JQuery?
    • 那么你最好的办法就是使用getElementsByClassName 做一些事情,因为该页面上几乎没有任何东西有 id
    • 它的 VBA,然后是在页面中运行 Javascript 例程的 VBA
    • 我假设 seocnd 最后留置权是 javascript 例程。我得到了 getelementsbyclassname ,但我不知道之后要指定什么。当我写 getelementsclassname + dot 时,没有任何相关的显示。如何通过 getelementsclassname 获取票价?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2011-01-23
    • 2013-01-04
    • 2019-06-27
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多