VBA Selenium获取同class名第二个表格数据失败求助
解决VBA Selenium提取同class名的第二个表格数据问题
问题核心
你之前的代码两次都用了FindElementByClass(单数方法),这个方法只会返回页面中第一个匹配class的元素,所以第二个循环其实还是在处理第一个表格的数据,自然拿不到第二个表格的内容。你尝试的item(2)无效,是因为单数方法返回的是单个元素,没有集合的索引属性,必须用复数的FindElementsByClass获取所有匹配元素的集合。
修改后的代码
Sub GetData() Dim DRow As Long ' 改用Long,避免行数超过Byte的255上限 Dim DCol As Byte Dim WebDrv As New WebDriver Dim tr As Object, td As Object Dim tables As Object ' 存储所有匹配的表格集合 WebDrv.Start "Chrome" WebDrv.Get "https://stripinfo.be/reeks/strip/11316_Jeremiah_5_Het_eindeloos_experiment" ' 用更可靠的显式等待,代替固定时长等待 WebDrv.Wait 5000 ' 等待5秒,直到元素加载完成 WebDrv.FindElementByClass("title").WaitDisplayed ' 获取页面中所有class为innerDividers的表格 Set tables = WebDrv.FindElementsByClass("innerDividers") ' 提取第一个表格数据(索引从1开始) [D7] = WebDrv.FindElementByClass("title").Text DRow = 8 DCol = 4 For Each tr In tables(1).FindElementByTag("tbody").FindElementsByTag("tr") For Each td In tr.FindElementsByTag("td") Cells(DRow, DCol).Value = td.Text DCol = DCol + 1 Next td DRow = DRow + 1 DCol = 4 Next tr ' 提取第二个表格数据 DRow = 15 DCol = 4 ' 重置列索引,避免数据偏移 For Each tr In tables(2).FindElementByTag("tbody").FindElementsByTag("tr") For Each td In tr.FindElementsByTag("td") Cells(DRow, DCol).Value = td.Text DCol = DCol + 1 Next td DRow = DRow + 1 DCol = 4 Next tr WebDrv.Quit ' 关闭浏览器,避免残留进程 End Sub
关键修改点
- 改用复数方法获取表格集合:用
FindElementsByClass代替FindElementByClass,得到所有class为innerDividers的表格,通过tables(1)和tables(2)分别访问第一个和第二个表格(Selenium VBA的元素集合是1-based索引,不是0-based)。 - 修复列索引重置问题:第二个循环重置
DCol为4,避免数据从上次结束的列开始写入。 - 替换固定等待为显式等待:
WebDrv.Wait和WaitDisplayed比Application.Wait更可靠,能适应不同的页面加载速度。 - 变量类型优化:把
DRow从Byte改为Long,避免当表格行数超过255时出现溢出错误。 - 添加浏览器关闭操作:代码末尾加入
WebDrv.Quit,防止Chrome进程后台残留。
内容的提问来源于stack exchange,提问作者Benny Vermeerschen
相关产品推荐
相关产品推荐

