Excel VBA正常运行的金币爬取代码在Access VBA中报错求助
Access VBA中querySelector使用:last-child伪类报错的解决办法
这段爬取金币价格的代码在Excel VBA中可正常运行,但在Access VBA里执行带:last-child伪类的querySelector语句时,会返回错误-2147024809(无效参数);仅选择父元素虽能运行,却无法获取目标的最后一个span元素。
问题原因
Access VBA依赖的HTMLDocument组件基于旧版IE内核,对CSS3伪类选择器支持有限,:last-child这类伪类不在其支持范围内,因此触发无效参数错误。
解决方案
可以通过先获取父元素,再遍历其子元素定位最后一个span的方式替代伪类选择器,具体实现如下:
修改后的完整代码
Function fncScrapeGOLDvalue() As Integer Dim html As HTMLDocument Set html = New HTMLDocument Dim returnValue As Integer With CreateObject("MSXML2.XMLHTTP") .Open "GET", "https://www.allgoldcoins.co.uk/products/2013-queen-elizabeth-ii-60th-anniversary-of-the-coronation-5-gold-proof-coin?variant=41603767205941", False .send html.body.innerHTML = .responseText End With Dim parentContainer As Object Dim spanElements As Object Dim targetSpan As Object Dim priceText As String ' 获取父容器 Set parentContainer = html.querySelector("#productPrice-product-template") If Not parentContainer Is Nothing Then ' 获取父容器下所有span元素 Set spanElements = parentContainer.getElementsByTagName("span") If spanElements.Length > 0 Then ' 取最后一个span(索引从0开始,用Length-1定位) Set targetSpan = spanElements(spanElements.Length - 1) ' 清理价格文本,去除英镑符号和千分位逗号 priceText = Replace(targetSpan.innerText, "£", "") priceText = Replace(priceText, ",", "") ' 先转Double处理小数,再转Integer fncScrapeGOLDvalue = CInt(CDbl(priceText)) Else ' 未找到span时返回默认值 fncScrapeGOLDvalue = 0 End If Else ' 未找到父容器时返回默认值 fncScrapeGOLDvalue = 0 End If End Function
额外说明
- 原代码直接用
CInt转换价格文本可能报错(比如价格带符号、千分位或小数),因此增加了文本清理和分步类型转换的步骤。 - 如果目标span有特定类名或属性,也可直接用兼容的CSS选择器(如
#productPrice-product-template span.className)定位,省去遍历操作。
内容的提问来源于stack exchange,提问作者Bill Dowton
相关产品推荐
相关产品推荐

