You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VBA提取HTML表格数据运行异常求助 附测试代码

问题原因分析
  • 选择器用法错误:getElementsByTagName()方法仅支持传入HTML原生标签名(如table、div),你传入的race-center-entry-list race-center-lineup是目标元素的class属性值,用该方法无法匹配到对应元素,是代码报错的直接原因。
  • 动态内容未加载:该站点的赛事表格属于JavaScript动态渲染内容,直接通过XMLHTTP请求拿到的初始HTML中不存在实际表格数据,htmlFile对象不会执行页面JS,因此就算选择器正确也无法读取到目标数据。
修正后代码
Option Explicit

Sub FetchNascarRaceData()
    Dim ie As Object
    Dim targetTable As Object
    Dim oRow As Object, oCell As Object
    Dim data As Variant
    Dim x As Long, y As Long
    
    ' 创建IE对象加载页面
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = False ' 设为True可显示IE窗口方便调试
    
    ' 加载目标页面
    With ie
        .navigate "https://www.nascar.com/results/racecenter/2021/nascar-cup-series/cook-out-southern-500"
        ' 等待页面完全加载
        Do Until .readyState = 4 And Not .Busy
            DoEvents
        Loop
        ' 额外等待1秒确保JS渲染完成,可根据网络情况调整时长
        Application.Wait Now + TimeValue("00:00:01")
    End With
    
    ' 用class选择器定位目标表格
    Set targetTable = ie.document.querySelector(".race-center-entry-list.race-center-lineup table")
    
    ' 读取表格数据
    If Not targetTable Is Nothing Then
        x = 1: y = 1
        ReDim data(1 To targetTable.Rows.Length, 1 To targetTable.Rows(1).Cells.Length)
        For Each oRow In targetTable.Rows
            For Each oCell In oRow.Cells
                data(x, y) = oCell.innerText
                y = y + 1
            Next oCell
            y = 1
            x = x + 1
        Next oRow
        ' 输出到工作表
        Sheets(1).Cells(1, 1).Resize(UBound(data), UBound(data, 2)).Value = data
    Else
        MsgBox "未找到目标表格,请检查页面加载状态"
    End If
    
    ' 清理资源
    ie.Quit
    Set ie = Nothing
    Set targetTable = Nothing
End Sub
注意事项
  • 运行前请确保Excel宏安全设置允许运行ActiveX控件
  • 若多次出现未找到表格的提示,可适当延长代码中的等待时长

内容的提问来源于stack exchange,提问作者Kyle Hansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:00:02