VBA data-responsetid для финансовых показателей Yahoo Finance - PullRequest
0 голосов
/ 27 марта 2019

Я прогуглил данные по реакции, и похоже, что в большинстве случаев они не работают с 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

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Вы можете попробовать следующее, чтобы избежать опасности.Как только 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
2 голосов
/ 27 марта 2019

getElementById возвращает один узел, поэтому вы не будете индексировать его, как делаете. Не существует метода getElementsById, поэтому он должен завершиться с ошибкой.

Вы можете использовать класс и экранировать специальные символы и индексировать в возвращаемую коллекцию

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

Или передать составной класс getElementsByClassName:

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

Атрибут (не идентификатор) data-reactid может варьироваться между страницей и выводом (как это происходит в этом случае - для строки в выводе идентификатор равен 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-реактид может сгибаться, но если вы хотите знать, как применить для этого селектор атрибута, см .:

MsgBox HTMLDoc.querySelector("tr[data-reactid='113']").innerText
...