从网站

时间:2018-04-24 15:29:55

标签: excel vba excel-vba web-scraping screen-scraping

我已经非常习惯于抓取这是一个令人烦恼的问题 - 我试图使用GET方法来掠夺VBA但是要获得由欧元提供的BHD兑换率Revolut并使用了以下代码:

Sub My_Scraper()
Dim oXHTTP As Object
Dim doc As New HTMLDocument
Dim html As String
Dim url As String

url = "https://www.revolut.com/converter/EURBHD"

Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
oXHTTP.Open "GET", url, False
oXHTTP.send
html = oXHTTP.responseText
Set oXHTTP = Nothing
doc.body.innerHTML = html
Debug.Print doc.getElementsByClassName("rvl-Rate-rateLabel")(0).innerHTML                 ' Returns "Current rate" as expected
Debug.Print doc.getElementsByClassName("rvl-Rate-rateLabel")(0).NextSibling.innerHTML     ' Reurns "0" (not the rate quoted

End Sub

我在上面的代码中打印了2个兄弟节点,当我在innerHTML的{​​{1}}看起来水平时,它仍然不清楚为什么会发生这种情况(我有正确的HTML部分,但响应是(在父级别 - 但不匹配开发人员工具控制台);

parentElement

这是开发人员工具控制台: enter image description here

2 个答案:

答案 0 :(得分:6)

站点在加载时重建DOM是很常见的,我想这就是你遇到问题的原因。我可以建议采用略有不同的方法。 如果您在浏览器中检查请求,您会发现:

https://www.revolut.com/api/quote/internal?symbol=EURBHD ...

删除EURBHD之后的所有内容,您可以更轻松地解析。

答案 1 :(得分:2)

这就是总脚本应该如何获得转换后的值:

Sub GetVal()
    Dim res As Variant

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.revolut.com/api/quote/internal?symbol=EURBHD", False
        .send
        res = .responseText
    End With

    res = Split(Split(res, "rate"":")(1), ",")(0)
    MsgBox res
End Sub