-1

我用谷歌搜索了 data-reactid ,似乎在大多数情况下它不适用于 VBA。

但我仍然认为有可能得到答案。我想在“经营活动的总现金流量”中获得数字

https://finance.yahoo.com/quote/BABA/cash-flow?p=BABA

Sub YFinance()

    Dim XMLReq As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim i As Integer
    Dim strUrl As String



    XMLReq.Open "GET", "https://finance.yahoo.com/quote/BABA/cash-flow?p=BABA", False
    XMLReq.send

    If XMLReq.Status <> 200 Then
        MsgBox "Error!"
        Exit Sub
    End If

    HTMLDoc.body.innerHTML = XMLReq.responseText

    Set XMLReq = Nothing

    MsgBox HTMLDoc.getElementsById("Bdbw(0px)! H(36px)")(0).innerText






End Sub
4

2 回答 2

2

getElementById返回单个节点,因此您不会像正在做的那样对其进行索引。没有任何方法getElementsById会因错误而失败。

您可以使用该类并将特殊字符和索引转义到返回的集合中

MsgBox HTMLDoc.querySelectorAll(".Bdbw\(0px\)\!")(1).innerText

或将复合类传递给getElementsByClassName

MsgBox HTMLDoc.getElementsByClassName("Bdbw(0px)! H(36px)")(1).innerText

属性 (不是 id)data-reactid可以在页面和输出之间变化(就像在这种情况下一样 - 输出中行的 id 为 113。在这种情况下,使用表和行索引可能更安全

MsgBox HTMLDoc.getElementsByTagName("table")(2).getElementsByTagName("tr")(9).innerText

如果您想要该行的逐列:

Dim td As Object, tds As Object
Set tds = HTMLDoc.getElementsByTagName("table")(2).getElementsByTagName("tr")(9).getElementsByTagName("td")
For Each td In tds
    Debug.Print td.innerText
Next

或者

Dim td As Object, tds As Object
Set tds = HTMLDoc.getElementsByClassName("Bdbw(0px)! H(36px)")(1).getElementsByTagName("td")
For Each td In tds
    Debug.Print td.innerText
Next

正如我所说,data-reactid 可以灵活调整,但如果您想知道如何为此应用属性选择器,请参阅:

MsgBox HTMLDoc.querySelector("tr[data-reactid='113']").innerText
于 2019-03-27T12:47:57.127 回答
2

您可以尝试以下方法以确保安全。一旦for loop获得所需的节点,它将获取您所需的内容并退出循环。

Sub FetchFinanceInfo()
    Dim XMLReq As New XMLHTTP60, HTMLDoc As New HTMLDocument
    Dim post As Object, I&

    XMLReq.Open "GET", "https://finance.yahoo.com/quote/BABA/cash-flow?p=BABA", False
    XMLReq.send
    HTMLDoc.body.innerHTML = XMLReq.responseText

    For Each post In HTMLDoc.getElementsByTagName("span")
        If InStr(post.innerText, "From Operating Activities") > 0 Then
            With post.ParentNode.ParentNode.getElementsByTagName("td")
                For I = 1 To .Length - 1
                    Debug.Print .Item(I).innerText
                Next I
            End With
            Exit For
        End If
    Next post
End Sub
于 2019-03-27T13:27:04.693 回答