VBA网页抓取表格数据时如何剔除多余的日历日期内容
解决方案
- 核心问题原因:当前代码是从整个页面文档中搜索所有
<table>标签,页面中的日期选择日历组件也是基于table标签渲染的,所以会被一同抓取输出。你已经定位到了仅包裹目标汇率表的id="data"的div容器,只要调整table的搜索范围即可解决。 - 具体修改方法:将原代码中
Set HTMLTABLES = HTMLDOC.getElementsByTagName("table")
替换为
Set HTMLTABLES = HTMLDIV.getElementsByTagName("table")
调整后仅会搜索data容器内部的表格,自动排除容器外的日历等无关表格内容。
- 修改后完整可运行代码(新增IE资源释放逻辑,避免残留后台进程):
Sub gettingTablesfromCBR() Dim IE As New SHDocVw.InternetExplorer Dim HTMLDOC As MSHTML.HTMLDocument Dim HTMLTABLES As MSHTML.IHTMLElementCollection Dim HTMLTABLE As MSHTML.IHTMLElement Dim HTMLDIV As MSHTML.IHTMLElement Dim TableSection As MSHTML.IHTMLElement Dim TableRow As MSHTML.IHTMLElement Dim TableCell As MSHTML.IHTMLElement IE.Visible = True IE.navigate "https://www.cbr.ru/eng/currency_base/dynamics/?UniDbQuery.Posted=True&UniDbQuery.so=1&UniDbQuery.mode=1&UniDbQuery.date_req1=&UniDbQuery.date_req2=&UniDbQuery.VAL_NM_RQ=R01100&UniDbQuery.From=07.08.2021&UniDbQuery.To=05.11.2021" Do While IE.ReadyState <> READYSTATE_COMPLETE Loop Set HTMLDOC = IE.Document Set HTMLDIV = HTMLDOC.getElementById("data") ' 仅在data容器内搜索表格,排除外部无关日历表格 Set HTMLTABLES = HTMLDIV.getElementsByTagName("table") Dim RowText As String For Each HTMLTABLE In HTMLTABLES For Each TableSection In HTMLTABLE.Children For Each TableRow In TableSection.Children RowText = "" For Each TableCell In TableRow.Children RowText = RowText & vbTab & TableCell.innerText Next TableCell Debug.Print , , RowText Next TableRow Next TableSection Next HTMLTABLE ' 关闭IE释放系统资源 IE.Quit Set IE = Nothing End Sub
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

