使用Excel VBA提取带下拉菜单的网页表格数据求助
解决Excel VBA抓取Banco BPI基金报价表格的问题
问题分析
原代码存在几个关键问题导致无法获取目标数据:
- 仅通过
IE.Busy判断页面加载不全面,切换下拉选项后未触发页面动态加载事件 - 固定等待时间无法确保动态表格完全加载
- 表格定位不准确,且数据填充逻辑错误
修正后的代码
Sub GetBPIInvestmentFunds() Dim IE As Object Dim dropdown As Object Dim targetTable As Object Dim row As Object, cell As Object Dim startRow As Integer, startCol As Integer Dim waitTime As Date ' 初始化IE对象 Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate "https://www.bancobpi.pt/cotacoes" ' 等待页面完全加载(同时判断IE状态和文档就绪状态) Do While IE.Busy Or IE.Document.readyState <> "complete" DoEvents Loop ' 定位下拉菜单(通过name属性更可靠,避免动态ID) Set dropdown = IE.Document.getElementsByName("wtSelAcoes")(0) If Not dropdown Is Nothing Then ' 选择第二个选项(索引1) dropdown.selectedIndex = 1 ' 触发下拉框的change事件,确保页面加载目标内容 Call IE.Document.parentWindow.execScript("arguments[0].dispatchEvent(new Event('change'));", "javascript", dropdown) ' 等待动态表格加载完成(最多等待10秒) waitTime = DateAdd("s", 10, Now) Do While Now < waitTime Set targetTable = IE.Document.querySelector("table.table-cotacoes") If Not targetTable Is Nothing Then Exit Do DoEvents Loop ' 填充数据到Excel(从Sheet1的A1单元格开始) startRow = 1 startCol = 1 For Each row In targetTable.getElementsByTagName("tr") startCol = 1 For Each cell In row.getElementsByTagName("td") ThisWorkbook.Sheets("Sheet1").Cells(startRow, startCol).Value = cell.innerText startCol = startCol + 1 Next cell startRow = startRow + 1 Next row End If ' 清理对象 IE.Quit Set IE = Nothing Set dropdown = Nothing Set targetTable = Nothing End Sub
关键改进点
- 页面加载判断:同时检查
IE.Busy和IE.Document.readyState = "complete",确保页面初始加载完成 - 下拉框触发事件:通过JavaScript触发下拉框的
change事件,强制页面加载对应内容(原代码仅设置选中索引未触发动态加载) - 动态表格等待:循环检查目标表格是否存在,最多等待10秒,避免固定等待时间的不确定性
- 表格定位:使用CSS选择器
querySelector("table.table-cotacoes")精准定位目标表格,比getElementsByTagName("table")(0)更可靠 - 数据填充逻辑:按行和列的顺序将表格数据填充到Excel单元格,修正原代码的单列填充错误
内容的提问来源于stack exchange,提问作者Pedro Reis
相关产品推荐
相关产品推荐

