【问题标题】:vba getElementById generated by javascriptjavascript生成的vba getElementById
【发布时间】:2019-10-07 23:53:57
【问题描述】:

我目前正在尝试在以下页面下载 div 的值:http://www.banrep.gov.co/es/tasa-cambio-del-peso-colombiano-trm 这个 div 的值是使用 javascript 生成的。有人可以告诉我是否可以通过 VBA 下载使用 javascript 生成的值?

Page image

这是我的代码:

Sub Basics_Of_Web_Macro()

    Dim myIE As Object
    Dim myIEDoc As Object

    Set myIE = CreateObject("InternetExplorer.Application")

    myIE.Visible = True

    myIE.navigate "http://www.banrep.gov.co/es/tasa-cambio-del-peso-colombiano-trm"

    While myIE.Busy
        DoEvents
    Wend

    Set myIEDoc = myIE.document


    MsgBox myIEDoc.Title

    MsgBox myIEDoc.getElementById("div_datos").innerText

End Sub

【问题讨论】:

  • 顺便说一句,完全有可能获得该值。
  • Sub Basics_Of_Web_Macro() 将 myIE 调暗为对象 将 myIEDoc 调暗为对象集 myIE = CreateObject("InternetExplorer.Application") myIE.Visible = True myIE.navigate "banrep.gov.co/es/tasa-cambio-del-peso-colombiano-trm" While myIE.Busy DoEvents Wend Set myIEDoc = myIE.document MsgBox myIEDoc.Title MsgBox myIEDoc.getElementById("div_datos").innerText End Sub
  • 这是我的代码,但是当我尝试获取 div 的值时,它会发送错误

标签: excel vba dom web-scraping


【解决方案1】:

页面使用另一个 URL 来获取该内容。您可以正则表达式从响应中取出值。您可以根据用例更多地概括正则表达式。

试试正则表达式here

Option Explicit
Public Sub Test()
    Dim s As String, re As Object, p As String
    p = "new Array\(.*, ""\d+,\d+"",""(\d+\.\d+,\d+)""\);"
    Set re = CreateObject("VBScript.RegExp")

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://obieebr.banrep.gov.co/analytics/saw.dll?Go&path=%2Fshared%2fSeries%20Estad%c3%adsticas_T%2F1.%20Tasa%20de%20Cambio%20Peso%20Colombiano%2F1.1%20TRM%20-%20Disponible%20desde%20el%2027%20de%20noviembre%20de%201991%2F1.1.6.TCM_TRM%20para%20un%20d%C3%ADa&lang=es&options=rdf&NQUser=publico&NQPassword=publico", False
        .send
        s = .responseText
        Debug.Print GetValue(re, s, p)        
    End With
End Sub

Public Function GetValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String
    With re
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .pattern = pattern
        If .Test(inputString) Then
            GetValue = .Execute(inputString)(0).SubMatches(0)
        Else
            GetValue = "Not found"
        End If
    End With
End Function

正则表达式解释:

【讨论】:

  • 现在我遇到了类似的问题,我正在尝试选择此页面 (banrep.gov.co/es/monedas-disponibles) 的下拉列表 (tipo de cambio) 的选项,但我做不到,有一些方法为此,这些控件是用 javascript 生成的
  • 稍后看看。现在在吃晚饭。
  • 你想用那个新页面做什么?就该页面上正在运行的 javascript 而言,您是正确的,因此您需要留出足够的时间让 spinner 消失。尝试不同的等待条件,例如微调元素消失
  • 或要存在的另一个元素或具有更长长度的节点列表....看看什么有效....如果仍然无法使其工作,请使用您的代码发布一个新问题,然后将问题的链接放在这里。
猜你喜欢
  • 2021-09-28
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多