使用Selenium嵌套循环提取网页全部表格数据的问题求助
问题原因分析
你原代码的核心问题出在行偏移逻辑和列数计算两个地方,导致多表格数据重叠覆盖、列读取异常:
- 列数统计错误:原代码统计的是整张表格所有
<td>标签的总数,而非单行列数,会导致列循环次数异常 - 行号累加逻辑错误:
actualRowNumber = actualRowNumber + i会让行号异常跳变,且输出时你还是用i-1做行偏移,新表格的数据会直接覆盖上一个表格的内容 - 未处理空行/表头行的异常:部分行可能只有
<th>标签无<td>,直接读取会抛出索引错误
修正后可运行代码
Sub GetResults() Dim wd As New WebDriver Dim table As WebElement Dim actualRowNumber As Long Dim RowNum As Long, ColNum As Long Dim i As Long, j As Long Dim trs As WebElements, tds As WebElements ' 初始化浏览器并加载页面 wd.Start "chrome" wd.Get "https://www.worldathletics.org/competition/calendar-results/results/7147613?day=2" ' 起始写入行设为第2行,可根据需要调整 actualRowNumber = 2 For Each table In wd.FindElementsByCss("[role=table]") Set trs = table.FindElementsByTag("tr") RowNum = trs.Count If RowNum = 0 Then GoTo NextTable ' 跳过空表格 ' 取第一行的td数量作为列数,避免统计全表td On Error Resume Next ColNum = trs(1).FindElementsByTag("td").Count On Error GoTo 0 If ColNum = 0 Then GoTo NextTable ' 跳过无有效数据的表格 For i = 1 To RowNum Set tds = trs(i).FindElementsByTag("td") If tds.Count = ColNum Then ' 仅读取列数匹配的有效行 For j = 1 To ColNum ' 基于全局累加的actualRowNumber写入,避免覆盖 Cells(actualRowNumber, j).Value = tds(j).Text Next j actualRowNumber = actualRowNumber + 1 ' 写完一行行号+1 End If Next i ' 两个表格之间空2行,保留你原需求 actualRowNumber = actualRowNumber + 2 NextTable: Next table ' 可选:自动调整列宽 Columns.AutoFit ' 关闭浏览器 wd.Quit Set wd = Nothing End Sub
核心改动说明
- 新增全局行号
actualRowNumber的初始赋值,所有表格数据都基于这个全局行号依次写入,不会出现覆盖 - 修正列数计算逻辑,取单行列数而非全表td总数
- 增加异常判断,跳过空表格、空行,避免运行时报错
- 写完所有数据后自动关闭浏览器释放资源,可选开启列宽适配
内容的提问来源于stack exchange,提问作者CarlosFC
相关产品推荐
相关产品推荐

