【问题标题】:Click on HTMLelement if condition is satisfied如果满足条件,则单击 HTML 元素
【发布时间】:2019-08-24 10:44:42
【问题描述】:

我想知道如果满足另一个条件,我如何设法通过 VBA 单击 html 元素。为了清楚起见,我将向您展示一个简短的示例:

我需要分析特定季度的数据(假设我需要 Q2),并且每个季度的 html 元素都分组在同一页面中的 class=module_item (EXAMPLE) 中。

网站是https://investor.apple.com/investor-relations/default.aspx

我的代码是这样的:

Dim IE As New InternetExplorer
Dim iedoc As MSHTML.HTMLDocument
Dim element As MSHTML.IHTMLElement
Dim elements As MSHTML.IHTMLElementCollection
Dim quarter As MSHTML.IHTMLElement
Dim freport As MSHTML.IHTMLElement

With IE:
    .navigate "https://investor.apple.com/investor-relations/default.aspx"
    .Visible = True
End With

Do While IE.readyState <> READYSTATE_COMPLETE
Loop

Set iedoc = IE.document

Set elements = iedoc.getElementsByClassName("module_item")
Set quarter = iedoc.getElementsByClassName("module-financial_year-text")
Set freport = iedoc.getElementsByClassName("module_link module_link-statement")

For Each element In elements:
    If quarter.innerText = "Q2" Then
    freport.Click
    End If
    Debug.Print element.innerText
    Next element


End Sub

你能帮帮我吗?

【问题讨论】:

    标签: html vba web-scraping


    【解决方案1】:

    您可以使用带有 * 包含运算符的 css attribute = value 选择器来测试是否存在包含季度描述的 href 属性

    Dim link As Object, targetQtr As String, cssSelector As String, quarter As Object
    
    targetQtr = "second"
    cssSelector = "[href*='apple-reports-" & targetQtr & "-quarter-results/']"
    Set quarter = ie.document.querySelectorAll(cssSelector)
    
    If Not quarter.Length = 0 Then
        quarter.Item(0).Click
    Else
        MsgBox "Quarter not found"
    End If
    

    另外,使用适当的页面加载等待:

    While IE.busy Or IE.readyState <> 4: DoEvents: Wend
    

    您还可以在字典中收集所有季度及其链接,以便您可以使用适当的季度键 .navigate 到任何特定季度,例如"second" 检索关联的 url。这意味着您还可以测试密钥是否存在。这样做的好处是您已经准备好所有链接,而不必来回访问着陆页。

    Option Explicit
    
    Public Sub test()
        Dim ie As Object, quarters As Object, quarterLinks As Object, targetQuarter As String
        Dim link As String, i As Long, arr() As String, key As Variant
    
        Set ie = CreateObject("InternetExplorer.Application")
        targetQuarter = "second"
    
        With ie
            .Visible = True
            .navigate2 "https://investor.apple.com/investor-relations/default.aspx"
            While .busy Or .readystate <> 4: DoEvents: Wend
            Set quarters = .document.querySelectorAll("[href*='-quarter-results/'].module_link-news")
    
            Set quarterLinks = CreateObject("Scripting.Dictionary")
    
            For i = 0 To quarters.Length - 1
                link = quarters.Item(i).href
                arr = Split(link, "-")
                quarterLinks(arr(2)) = link
            Next
    
            If quarterLinks.exists(targetQuarter) Then .navigate2 quarterLinks(targetQuarter)
    
            While .busy Or .readystate <> 4: DoEvents: Wend
    
            Stop                                     '<=delete me later
            .Quit
        End With
    End Sub
    

    【讨论】:

    • 谢谢。 If Not Quarter.Length = 0 Then 是什么意思?
    • 它测试该节点是否存在 - 如果 html 元素不存在,则长度将为 0。尝试一下,让我知道它是否有效。
    • 它有效,谢谢。只是 fex 问题:1)我打开互联网并查找 html 元素的方法与您的方法有什么区别?我的意思是我使用一个特定的库,而您将 Internet 定义为对象。有什么实际区别吗? 2)此外,vba中是否有一个字符串显示“如果href/class/name/value CONTAINS“xxxx”然后单击它?
    • 1) 我使用后期绑定参考,因此用户不必添加任何参考。分发代码时速度稍慢但很常见。 2) 还有一个叫做 Instr 的函数 Instrrev 用于检查一个字符串是否包含另一个字符串。
    猜你喜欢
    • 2013-11-15
    • 2015-11-03
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多