我正在尝试使用 VBA 将 Yahoo Finance 中的一些数据提取到 Excel 电子表格的单元格中

问题描述 投票:0回答:1

我正在尝试将雅虎财经的一些数据提取到 Excel 的某些单元格中。 我对 VBA 不太热衷,发现这段代码似乎可以满足我的要求。 但是,当我运行它时,它返回文本,但似乎没有正确解析。

代码返回一个非常长的文本 - 基本上是所需链接的所有“查看代码”html 文本。 查看文本,需要的数据在那里,但根本没有被解析和返回。 resonseText 中给出我需要的数据的行以此字符串开头:

      <script type="application/json" data-sveltekit-fetched data-url="https://query1.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&amp;modules=upgradeDowngradeHistory%2CrecommendationTrend%2Cfinanci

“numberOfAnalystOptions”的字符串部分如下所示:

“购买”,“numberOfAnalystOpinions”:{“raw”:37,“fmt”:“37”,“longFmt”:“37”},“totalCash”:{“raw”:67150000128,“fmt”

如果有人可以帮助我获取其中包含的数据,我将非常感激。

   Sub SharePrices()

   Const Url As String = "https://finance.yahoo.com/quote/AAPL/analysis?p=AAPL"
    Dim sResp$, sHigh$, currentPrice$
    Dim analystNum$, sLow$, tMeanprice$

With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", Url, False
    .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"
    .send
    sResp = .responseText
End With

With CreateObject("VBScript.RegExp")
    .Pattern = "numberOfAnalystOpinions[\s\S]+?raw"":(.*?),"
    If .Execute(sResp).Count > 0 Then
        analystNum = .Execute(sResp)(0).SubMatches(0)
    End If

    .Pattern = "targetMeanPrice[\s\S]+?raw"":(.*?),"
    If .Execute(sResp).Count > 0 Then
        tMeanprice = .Execute(sResp)(0).SubMatches(0)
    End If

    .Pattern = "targetHighPrice[\s\S]+?raw"":(.*?),"
    If .Execute(sResp).Count > 0 Then
        sHigh = .Execute(sResp)(0).SubMatches(0)
    End If

    .Pattern = "targetLowPrice[\s\S]+?raw"":(.*?),"
    If .Execute(sResp).Count > 0 Then
        sLow = .Execute(sResp)(0).SubMatches(0)
    End If

    .Pattern = "currentPrice[\s\S]+?raw"":(.*?),"
    If .Execute(sResp).Count > 0 Then
        currentPrice = .Execute(sResp)(0).SubMatches(0)
    End If
End With

    ActiveCell.Value = "Test"
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = analystNum
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = tMeanprice
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = sHigh
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = sLow
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = currentPrice

End Sub
excel vba finance yahoo-finance
1个回答
0
投票

响应包含转义的 JSON 文本,因此引号前面有反斜杠 (

\
),这是 JSON 中的转义字符。

您需要将其作为文字字符包含在正则表达式中,这意味着您必须在正则表达式中对其进行转义。正则表达式转义字符也是反斜杠,因此这意味着

\\
表示正则表达式中的文字反斜杠。

因此,您需要在每个正则表达式中的

\\
之前插入
""
,如下所示:

.Pattern = "numberOfAnalystOpinions[\s\S]+?raw\\"":(.*?),"

.Pattern = "targetMeanPrice[\s\S]+?raw\\"":(.*?),"

等等。

插入这些文字反斜杠后,正则表达式全部匹配成功。 (当然,我不能保证结果符合您的预期,尤其是返回的 HTML 可能会有所不同。)

© www.soinside.com 2019 - 2024. All rights reserved.