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
相关产品推荐
相关产品推荐

