如何使用VBA-Selenium从嵌套Div提取动态加载表格到Excel?
解决VBA-Selenium获取动态加载表格数据并导出到Excel的问题
你遇到的核心问题是页面表格属于动态加载内容,登录后立即抓取页面HTML时,表格还未渲染完成,所以只拿到了加载状态的Div。以下是针对性的修改方案:
关键修改点
- 调整等待策略:用显式等待替代过早的隐式等待,确保目标表格元素加载完成后再进行抓取
- 修正无效配置位置(比如
--headless需放在启动浏览器前才生效) - 新增表格数据直接导出到Excel的逻辑
修改后的完整代码
Option Explicit Private ch As Selenium.ChromeDriver Sub TestSelenium() Set ch = New Selenium.ChromeDriver ' 配置无头模式(如需隐藏浏览器窗口) ch.AddArgument "--headless" ch.Start ch.Get "https://siteaddress" ' 设置全局隐式等待(单位:毫秒) ch.Timeouts.ImplicitWait = 10000 ' 执行登录操作 With ch.FindElementById("logInForm", timeout:=10000) .FindElementById("j_username").SendKeys "username" .FindElementById("j_password").SendKeys "password" .FindElementById("submitButton").Click End With ' 显式等待目标表格加载完成(替换为你实际的表格ID/选择器) ' 示例:等待ID为"targetTable"的表格显示 ch.WaitUntil (Condition:=Function(d) d.FindElementById("targetTable").IsDisplayed), timeout:=20000 ' 定位目标表格 Dim targetTable As Selenium.WebElement Set targetTable = ch.FindElementById("targetTable") ' 将表格数据导出到Excel Dim ws As Worksheet Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) ws.Name = "抓取数据" ' 遍历表格行与列,写入Excel单元格 Dim rows As Selenium.WebElements, cols As Selenium.WebElements Dim i As Integer, j As Integer Set rows = targetTable.FindElementsByTag("tr") For i = 1 To rows.Count Set cols = rows(i).FindElementsByTag("td") For j = 1 To cols.Count ws.Cells(i, j).Value = cols(j).Text Next j Next i ' 可选:保存加载完成后的完整页面HTML到TXT Dim filePath As String filePath = "C:\temp\MyTestFile.txt" Dim fso As FileSystemObject Set fso = New FileSystemObject If fso.FileExists(filePath) Then fso.DeleteFile filePath With fso.CreateTextFile(filePath) .Write ch.ExecuteScript("return document.body.innerHTML;") .Close End With ch.Quit Set ch = Nothing MsgBox "数据导出完成!", vbInformation End Sub
注意事项
- 替换代码中的
"targetTable"为你实际要抓取的表格ID(可通过浏览器审查元素工具获取) - 确保已引用以下库:
- Selenium Type Library(对应你的Selenium版本)
- Microsoft HTML Object Library
- Microsoft Scripting Runtime(用于FileSystemObject)
- 如果表格嵌套在iframe中,需在定位表格前执行
ch.SwitchToFrame ch.FindElementByTag("iframe")切换到对应iframe
内容的提问来源于stack exchange,提问作者SSG
相关产品推荐
相关产品推荐

