You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA获取HTML元素:抓取皇家铸币局硬币价格遇阻求助

问题描述

我试图从英国皇家铸币局网站获取一枚1826年乔治四世精制半主权金币的价格,但所需的HTML元素既没有ID也没有专属类名。我已通过Chrome开发者工具初步定位相关内容,并编写了如下VBA代码,但不清楚后续该如何推进以获取目标价格。

现有代码

Public Function XMLscrapeTest2() As Integer

Dim XMLpage As New MSXML2.XMLHTTP60
Dim HTMLdoc As New MSHTML.HTMLDocument

Dim HTMLelement As MSHTML.IHTMLElement
Dim HTMLelements As Object
Dim HTMLspan As HTMLSpanElement

Dim strURL As String

    strURL = "https://www.royalmint.com/sovereign/all/1826-George-IV-Proof-Half-Sovereign/"

    XMLpage.Open "GET", strURL, False
    XMLpage.send
    HTMLdoc.body.innerHTML = XMLpage.responseText
            
    Set HTMLelements = HTMLdoc.getElementsByClassName("d-none d-md-block mb-0")
    Debug.Print "d-none d-md-block mb-0>>>>" & HTMLelements.length
    Set HTMLelements = HTMLdoc.querySelectorAll("p")
    Debug.Print HTMLelements.length
    For intI = 0 To HTMLelements.length - 1
        Debug.Print intI, HTMLelements(intI).getAttribute("classname")
    Next intI            
End Function

调试输出

d-none d-md-block mb-0>>>>1
8
0
1
2
3
4
5
6             d-none d-md-block mb-0
7

解决方案

1. 定位目标元素

从调试输出可知,页面中存在1个类名为d-none d-md-block mb-0的元素,且它是第6个<p>标签(索引从0开始)。这个元素就是价格信息的容器,直接通过类名定位即可。

2. 修正代码问题

  • 原代码中getAttribute("classname")写法错误,HTML属性应为class,正确写法是getAttribute("class")。
  • 函数返回类型设为Integer不合理,价格属于字符串类型,应改为String。

3. 完整可运行代码

Public Function XMLscrapeTest2() As String
    Dim XMLpage As New MSXML2.XMLHTTP60
    Dim HTMLdoc As New MSHTML.HTMLDocument
    Dim targetElement As MSHTML.IHTMLElement
    Dim priceText As String
    Dim strURL As String
    
    strURL = "https://www.royalmint.com/sovereign/all/1826-George-IV-Proof-Half-Sovereign/"
    
    ' 添加请求头模拟浏览器访问,避免被反爬拦截
    XMLpage.Open "GET", strURL, False
    XMLpage.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    XMLpage.send
    
    ' 加载HTML文档
    HTMLdoc.body.innerHTML = XMLpage.responseText
    
    ' 获取价格所在的目标元素(该类仅1个元素,索引为0)
    Set targetElement = HTMLdoc.getElementsByClassName("d-none d-md-block mb-0")(0)
    
    ' 提取价格文本,Trim去除多余空格
    priceText = Trim(targetElement.innerText)
    
    ' 如果价格嵌套在子元素(如<span>)中,可改用以下代码定位
    ' Dim priceElement As MSHTML.IHTMLElement
    ' Set priceElement = targetElement.querySelector("span")
    ' If Not priceElement Is Nothing Then priceText = Trim(priceElement.innerText)
    
    ' 输出调试信息
    Debug.Print "获取到的硬币价格:" & priceText
    
    ' 返回价格结果
    XMLscrapeTest2 = priceText
End Function

4. 代码说明

  • 请求头设置:添加User-Agent模拟浏览器请求,避免网站将XMLHTTP识别为爬虫而拒绝返回内容。
  • 元素定位:直接通过getElementsByClassName获取唯一的目标容器元素。
  • 文本提取:优先使用innerText获取元素内的文本内容,如果价格嵌套在子标签中,再用querySelector定位子元素提取。

内容的提问来源于stack exchange,提问作者Bill Dowton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:43:36