如何用VBA可靠抓取网页中位置不固定的指定项值?
可靠抓取"Year Built"值的解决方案
针对你遇到的两个问题,我会逐一给出实用的解决方案:
一、不依赖位置稳定抓取"Year Built"值
你的初始方法依赖元素的索引位置,一旦网页结构微调就会失效。核心解决思路是通过文本匹配定位标签,再关联到对应的值,具体实现步骤如下:
- 找到包含"Year Built"文本的
<tr>元素; - 获取该
<tr>的下一个兄弟<tr>(也就是存储对应数值的行); - 在这个值行里,遍历所有
<td>元素,找到文本为"Year Built"的标签<td>,它的下一个<td>就是我们要的年份值。
修改后的稳定版代码如下:
Sub GetInformation() Dim Http As New XMLHTTP60, links, i&, j& Dim Htmldoc As New HTMLDocument, link Dim Wb As Workbook, ws As Worksheet, r& Dim targetTr As HTMLTableRow Set Wb = ThisWorkbook Set ws = Wb.Worksheets("Sheet1") links = Array( _ "https://esearch.brazoscad.org/Property/View/114414", _ "https://esearch.brazoscad.org/Property/View/117608" _ ) For Each link In links With Http .Open "GET", link, False .send Htmldoc.body.innerHTML = .responseText End With With Htmldoc.querySelectorAll("tr") For i = 0 To .Length - 1 If InStr(.item(i).innerText, "Year Built") > 0 Then r = r + 1 Set targetTr = .item(i).NextSibling ' 遍历目标行的td,匹配标签并获取对应值 With targetTr.getElementsByTagName("td") For j = 0 To .Length - 1 If .item(j).innerText = "Year Built" Then ws.Cells(r, 1) = .item(j + 1).innerText Exit For ' 找到后退出循环,提升效率 End If Next j End With Exit For ' 找到目标行后退出外层循环 End If Next i End With Next link ' 释放对象,避免内存占用 Set Http = Nothing Set Htmldoc = Nothing Set targetTr = Nothing End Sub
这个方法完全不依赖元素的位置索引,只要网页保持"标签+值"的配对结构,就能稳定抓取数据。
二、为什么querySelector("table:nth-of-type(2) tr")无法生效?
问题根源在于VBA使用的MSHTML引擎对CSS3选择器的支持有限:
:nth-of-type()是CSS3新增的伪类选择器,但VBA的HTMLDocument基于旧版IE的渲染引擎(对应IE9及更早版本),对这类CSS3选择器的支持不完善,因此无法识别该语法。
替代方案:使用getElementsByTagName按索引定位表格,再获取其中的<tr>元素,兼容性更好:
' 获取第二个表格(索引从0开始计数) Set targetTable = Htmldoc.getElementsByTagName("table")(1) ' 遍历表格内的所有tr元素 For Each tr In targetTable.getElementsByTagName("tr") ' 你的业务处理逻辑 Next tr
内容的提问来源于stack exchange,提问作者MITHU
相关产品推荐
相关产品推荐

