我正在尝试将雅虎财经的一些数据提取到 Excel 的某些单元格中。 我对 VBA 不太热衷,发现这段代码似乎可以满足我的要求。 但是,当我运行它时,它返回文本,但似乎没有正确解析。
代码返回一个非常长的文本 - 基本上是所需链接的所有“查看代码”html 文本。 查看文本,需要的数据在那里,但根本没有被解析和返回。 resonseText 中给出我需要的数据的行以此字符串开头:
<script type="application/json" data-sveltekit-fetched data-url="https://query1.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&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
响应包含转义的 JSON 文本,因此引号前面有反斜杠 (
\
),这是 JSON 中的转义字符。
您需要将其作为文字字符包含在正则表达式中,这意味着您必须在正则表达式中对其进行转义。正则表达式转义字符也是反斜杠,因此这意味着
\\
表示正则表达式中的文字反斜杠。
因此,您需要在每个正则表达式中的
\\
之前插入 ""
,如下所示:
.Pattern = "numberOfAnalystOpinions[\s\S]+?raw\\"":(.*?),"
.Pattern = "targetMeanPrice[\s\S]+?raw\\"":(.*?),"
等等。
插入这些文字反斜杠后,正则表达式全部匹配成功。 (当然,我不能保证结果符合您的预期,尤其是返回的 HTML 可能会有所不同。)