如何使用VBA提取网页表格中td标签内的数据?现有代码调试求助
问题描述
我在编写网页数据抓取代码时遇到问题:代码前半段可以正常运行,但负责提取站点表格数据的后半段一直写不对。问题卡在<td>标签上,我需要拿到<td>标签里的全部或部分内容,试了很多次都没成功,能不能提供可以正常提取表格数据的代码?
我已经写好的代码如下:
Sub provera_TR_klijenta() '需要在引用里勾选: _ Microsoft Internet Controls _ Microsoft HTML Object Library Dim objIE As InternetExplorer '代表IE浏览器的对象变量 Dim aEle As HTMLLinkElement '<a>链接元素的对象变量 Dim ieDoc As MSHTML.HTMLDocument Dim iframeDoc As MSHTML.HTMLDocument '初始化IE浏览器实例 Set objIE = New InternetExplorer '设置IE可见,设置为False可后台运行 objIE.Visible = True objIE.Width = 1000 objIE.Height = 800 '打开目标页面 objIE.navigate "https://nbs.rs/en/drugi-nivo-navigacije/servisi/jedinstveni-registar-racuna/index.html" '等待页面加载完成 Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop Set ieDoc = objIE.document Set iframeDoc = ieDoc.frames(0).document '填入查询参数并提交 iframeDoc.getElementsByName("matbr")(1).Value = "21122017" iframeDoc.getElementsByName("Submit")(0).Click Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop '*** 后续提取表格数据的代码不知道怎么写 *** End Sub
解决代码
在你标注不知道如何编写的位置之后,追加以下代码即可实现表格内容提取,默认将数据输出到当前激活的工作表中:
' 等待iframe内的结果表格加载完成,避免提前取值报错 Dim tbl As MSHTML.HTMLTable On Error Resume Next Do DoEvents Set tbl = iframeDoc.getElementsByTagName("table")(0) Loop While tbl Is Nothing On Error GoTo 0 ' 配置输出工作表 Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet Dim rowNum As Long, colNum As Long rowNum = 1 ' 数据写入的起始行 ' 遍历表格所有行 Dim tr As MSHTML.HTMLTableRow Dim td As MSHTML.HTMLTableCell For Each tr In tbl.Rows colNum = 1 ' 每行写入的起始列 ' 遍历当前行的所有单元格 For Each td In tr.Cells ' innerText为单元格纯文本内容,需要带格式的源码可替换为td.innerHTML ws.Cells(rowNum, colNum).Value = td.innerText colNum = colNum + 1 Next td rowNum = rowNum + 1 Next tr ' 操作完成后释放资源 objIE.Quit Set objIE = Nothing Set iframeDoc = Nothing Set ieDoc = Nothing Set ws = Nothing
注意事项
- 如果目标页面存在多个表格,调整
getElementsByTagName("table")(索引)的索引值即可,索引从0开始计数 - 如果只需要提取指定列的内容,遍历单元格时增加列号判断逻辑即可
- 若网络环境较差,可在点击提交按钮后额外增加1-2秒的固定等待,减少循环等待的资源占用
内容的提问来源于stack exchange,提问作者Stevinho
相关产品推荐
相关产品推荐

