Excel VBA网页数据提取求助:无法获取HTML元素的文本与数值
解决Excel VBA提取NSE India股票数据的问题
问题分析
原代码无法正确获取数据的核心原因有两个:
- NSE India的页面依赖JavaScript动态渲染内容,
MSXML2.XMLHTTP60仅能获取原始HTML源码,无法加载JS执行后的动态内容。 - 元素定位和属性调用错误:
- 针对表格类元素(
equityInfo、priceInfoTable),仅获取父容器未定位到目标子元素 <span>元素没有Value属性,需用innerText提取内容
- 针对表格类元素(
修正后的代码
Option Explicit Sub GetStockData() Dim IE As Object Dim HTMLDoc As MSHTML.HTMLDocument Dim StockName As MSHTML.IHTMLElement Dim StockSymbol As MSHTML.IHTMLElement Dim StockLTP As MSHTML.IHTMLElement Dim StockPrevClose As MSHTML.IHTMLElement ' 初始化IE对象 Set IE = CreateObject("InternetExplorer.Application") With IE .Visible = True ' 设为False可隐藏浏览器窗口 .Navigate "https://www.nseindia.com/get-quotes/equity?symbol=POONAWALLA" ' 等待页面加载完成 Do While .Busy Or .ReadyState <> 4 DoEvents Loop End With Set HTMLDoc = IE.Document ' 定位目标元素 Set StockName = HTMLDoc.getElementById("quoteName") Set StockSymbol = HTMLDoc.querySelector("#equityInfo > tbody > tr > td:nth-child(2)") Set StockLTP = HTMLDoc.getElementById("quoteLtp") Set StockPrevClose = HTMLDoc.querySelector("#priceInfoTable > tbody > tr > td:nth-child(1)") ' 输出提取结果到立即窗口 If Not StockName Is Nothing Then Debug.Print "股票名称: " & StockName.innerText If Not StockSymbol Is Nothing Then Debug.Print "股票代码: " & StockSymbol.innerText If Not StockLTP Is Nothing Then Debug.Print "当前价格(LTP): " & StockLTP.innerText If Not StockPrevClose Is Nothing Then Debug.Print "前收盘价: " & StockPrevClose.innerText ' 关闭IE并释放对象 IE.Quit Set IE = Nothing Set HTMLDoc = Nothing End Sub
使用注意事项
- 需在VBA编辑器中添加引用:
- 打开VBA编辑器 → 工具 → 引用 → 勾选Microsoft Internet Controls和Microsoft HTML Object Library
- 若页面加载较慢,可适当增加等待时间,避免元素未渲染完成导致定位失败
- 若后续页面结构变更,需重新检查并更新元素选择器
内容的提问来源于stack exchange,提问作者Sourav
相关产品推荐
相关产品推荐

