【问题标题】:How to handle with hasDatepicker class - IE Automation如何处理 hasDatepicker 类 - IE 自动化
【发布时间】:2019-04-23 23:29:59
【问题描述】:

我有这样的代码,可以打开带有两个输入框的网页。我正在尝试显示与默认日期不同的货币表,但它不起作用。只有当鼠标单击“报告”按钮时,一切都很好 - 然后我可以显示任何日期。 有人有什么主意吗?

我已经尝试过:"Application.SendKeys ("{ENTER}"), True" 和不同的日期格式。我也在寻找有关 hasDatepicker 类的信息...

Sub getDataFrombrowser()

 Dim address As String
 Dim browser As InternetExplorer

 Set browser = New InternetExplorerMedium
 With browser
     .Visible = True
 End With

 address = "http://www.nbrm.mk/kursna_lista-en.nspx"

 With browser
     .navigate address
     Do While .Busy Or .readyState <> 4: DoEvents: Loop
     .navigate address
     Do While .Busy Or .readyState <> 4: DoEvents: Loop
 End With

 browser.document.getElementsByClassName("form-control sdate hasDatepicker")(0).Value = Format(Date - 1, "DD.MM.YYYY")
 browser.document.getElementsByClassName("form-control edate hasDatepicker")(0).Value = Format(Date - 1, "DD.MM.YYYY")

 Set objCollection = browser.document.getElementsByTagName("input")
objCollection(7).Click

End Sub

【问题讨论】:

    标签: excel vba internet-explorer web-scraping


    【解决方案1】:

    您可以模仿页面所做的 POST 请求并使用 XMLHTTP 而不是慢速浏览器。你得到一个 json 响应。您可以使用 json 解析器来处理此问题并提取您想要的信息。我提取一切。标题是斯洛文尼亚语,但您可以用自己的硬编码英文值替换。查看完整示例 json 响应 here。

    下载json解析器here

    您在请求正文中指定开始和结束日期。

    Public Sub GetRates()
        'install https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas and add to project
        'VBE > Tools > References > Microsoft Scripting Runtime Library
        Dim json As Object, body As String
        Dim ws As Worksheet, results(), headers()
    
        body = "{""startDate"":""23.03.2019"",""endDate"":""21.04.2019"",""isStateAuth"":""0""}"
        Set ws = ThisWorkbook.Worksheets("Sheet1")
    
        With CreateObject("MSXML2.XMLHTTP")
            .Open "POST", "http://www.nbrm.mk/services/ExchangeRates.asmx/GetEXRates", False
            .setRequestHeader "User-Agent", "Mozilla/5.0"
            .setRequestHeader "Content-Type", "application/json; charset=UTF-8"
            .setRequestHeader "Referer", "http://www.nbrm.mk/kursna_lista-en.nspx"
            .setRequestHeader "Content-Length", Len(body)
            .send body
    
            Set json = JsonConverter.ParseJson(.responseText)
    
            Dim ratesParent As Object, rates As Object, rate As Object, header As Object
    
            Set ratesParent = json("d")
            Set header = ratesParent.item(1)("ExchangeRates").item(1)
    
            ReDim results(1 To 10000, 1 To header.Count)
            ReDim headers(1 To header.Count)
            Dim key As Variant, c As Long, r As Long
    
            headers = header.keys
    
            For Each rates In ratesParent       
                For Each rate In rates("ExchangeRates")                  'dictionaries
                    r = r + 1: c = 1
                    For Each key In rate.keys
                        results(r, c) = rate(key)
                        c = c + 1
                    Next
                Next 
            Next
            With ws
                .Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
                .Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
            End With
        End With
    End Sub
    

    【讨论】:

    • 哇,看起来棒极了!好快啊!
    • 说实话,我不确定如何处理对象等,但我会尝试。我已经准备了 30 多个网页(除了这个),但我不知道这样的魔法是如此接近 :) 我会尝试使用这个解决方案,并会得到反馈或问题!谢谢!
    • 在 Json 中,如果您看到 [],它是您每次遍历或索引的集合。如果您看到 {} 它是一个字典,您可以循环键或按键访问
    • .responseText 是 Json,您可以将其写入文件,然后将其复制粘贴到在线 Json 查看器中,并使用它来检查所需元素的结构和工作路径
    • 对此有任何疑问吗?
    猜你喜欢
    • 2015-05-08
    • 2014-12-09
    • 1970-01-01
    • 2014-12-04
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多