使用Excel VBA抓取网页表格如何仅提取目标内容排除多余数据
VBA提取指定网页表格的修改方案
问题根因
你当前的代码会遍历页面内所有<table>标签并全部写入工作表,因此会导入页面上所有无关的表格内容,只需调整表格定位逻辑,只抓取目标表格即可。
调整后的代码
Sub Web_Table() Dim HTMLDoc As New HTMLDocument Dim objTable As Object Dim lngRow As Long Dim lngCol As Long Dim ActRw As Long Dim objIE As InternetExplorer ' 初始化IE对象 Set objIE = New InternetExplorer objIE.Navigate "https://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=PET&s=EMD_EPD2DXL0_PTE_NUS_DPG&f=W" ' 等待页面加载完成 Do Until objIE.ReadyState = 4 And Not objIE.Busy DoEvents Loop Application.Wait (Now + TimeValue("0:00:03")) '等待JS渲染完成 HTMLDoc.body.innerHTML = objIE.Document.body.innerHTML ' 清空目标工作表旧数据 ThisWorkbook.Sheets("Sheet1").Cells.Clear ' ==========核心修改:直接定位目标表格,无需遍历所有表格========== ' 方法1:如果你已经知道目标表格是页面中第N个表格(索引从0开始),直接指定索引 Set objTable = HTMLDoc.getElementsByTagName("table")(2) ' 你可以先调试确定正确的索引 ' 方法2:如果表格有唯一id/class,用querySelector定位更稳定,比如表格class为data-grid就写: ' Set objTable = HTMLDoc.querySelector("table.data-grid") ' ============================================================ ' 判断表格是否存在,避免报错 If Not objTable Is Nothing Then For lngRow = 0 To objTable.Rows.Length - 1 For lngCol = 0 To objTable.Rows(lngRow).Cells.Length - 1 ThisWorkbook.Sheets("Sheet1").Cells(lngRow + 1, lngCol + 1) = objTable.Rows(lngRow).Cells(lngCol).innerText Next lngCol Next lngRow Else MsgBox "未找到目标表格,请检查页面结构或定位参数" End If ' 释放资源 objIE.Quit Set objIE = Nothing Set HTMLDoc = Nothing End Sub
调试技巧
如果不知道目标表格的索引,可以在获取所有表格后加一段调试代码,在立即窗口输出所有表格的特征,找到对应索引:
Set allTables = HTMLDoc.getElementsByTagName("table") For i = 0 to allTables.Length - 1 Debug.Print "索引:" & i & ",首行内容:" & allTables(i).Rows(0).innerText & ",行数:" & allTables(i).Rows.Length Next i
注意事项
- 运行前请在VBA编辑器的「工具」-「引用」中勾选 Microsoft HTML Object Library 和 Microsoft Internet Controls
- 如果后续页面结构变动,只需重新确认目标表格的索引或选择器,替换对应定位参数即可
内容的提问来源于stack exchange,提问作者Rajput
相关产品推荐
相关产品推荐

