使用VBA web scrape在下拉菜单中选择值

时间:2014-12-18 19:54:16

标签: java excel vba web-scraping

我在尝试从javascript网页上的下拉菜单中选择项目时出现问题。我的最终目标是通过用户表单填写菜单值,但我没有成功创建VB来选择下拉列表。网页代码如下

<select name="dateSelector0" class="clsInputArea selectBox valid" style="display: none; "onchange="setDateRange(this, 'rtf[0].val1', 'rtf[0].val2')">
   <option value="-1"></option>
   <option value="1">Last Month</option>
   <option value="2">Current Month</option>
   <option value="3">Next Month</option>
   <option value="4">Last Year</option>
   <option value="5">Current Year</option>
   <option value="6">Next Year</option>
   <option value="7">First Quarter</option>
   <option value="8">Second Quarter</option>
   <option value="9">Third Quarter</option>
   <option value="10">Fourth Quarter </option></select>

<a tabindex="NaN" title="" class="selectBox clsInputArea selectBox-dropdown" style="width: 147px; display: inline-block;" href="javascript:void(0);"><span class="selectBox-label" style="width: 127px;">&nbsp;</span><span class="selectBox-arrow"></span></a>

我尝试了各种GetElementsBy,使用上述两个名称,尝试下面的名称和ID rtf [0] .val1,但无济于事,下面的示例。我相信通过dateSelector0名称会是最好的,但我会非常感谢你们这些人的投入比我更好。

ie.Document.Body.GetElementsByname("dateSelector0").Value = "1"
ie.Document.Body.GetElementsByname("dateSelector0").Item(0).FireEvent ("onchange")

2 个答案:

答案 0 :(得分:1)

你几乎拥有它。我刚试过:

Sub IE_Navigate()

'Declare
Dim IE As Object

'Use IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True

IE.navigate ("Website URL")

'Wait for Load to finish
While IE.readyState <> 4
DoEvents
Wend
Application.Wait (Now + TimeValue("0:00:01"))

这两种方法对我都有用。
通过ClassName从dropmenu中选择数据:

IE.document.getElementsByClassName("clsInputArea")(0).Value = 1


从名称

的dropmenu中选择数据
IE.document.getElementsByName("dateSelector0")(0).Value = 1

从下拉菜单中返回第一项。

EDITED

答案 1 :(得分:1)

如果您观察到以下CSS选择器,其中"." means class" option"表示选择该类(clsInputArea selectBox valid)元素内的所有“选项”标记,您将看到它正确选择。

注意:CSS选择器中不允许使用复合名称,这就是为什么用“。”替换空格的原因。在班级名称中。

示例CSS查询结果:

Sample results

<强> VBA:

现在,我们可以将其翻译成以下语法:

ie.Document.getElementsByClassName("clsInputArea selectBox valid")(0).getElementsByTagName("option")

这假定索引0是用于“select_list”类的元素的正确索引。如果将集合设置为变量,则可以轻松检查集合以找到正确的索引,例如

Dim x As Object
Set x = ie.Document.getElementsByClassName("clsInputArea selectBox valid")(0).getElementsByTagName("option")

假设对象不是什么,那么我们可以通过其索引(即位置)选择一个选项,或者通过循环收集并选择何时满足某个条件,例如:它的innerText匹配一个想要的短语。

按索引选择

这意味着你可以说

x.SelectedIndex = 1选择Last Month

通过循环选择:

Dim currentOption As Object
For Each currentOption In x
    If InStr(currentOption.innerText, "Last Month") > 0 Then
        currentOption.Selected = True
        Exit For
    End If
Next currentOption

选择下拉列表的完整示例:

由于您未提供网址,因此以下是使用其他网站的示例。网页目标下拉列表Código de Ativo显示在此处:

Target dropdown

要选择的目标选项为AALR21,其为数字3,或第2项基于0的索引。

对项目innertext AAL21进行循环和匹配:

Option Explicit
Public Sub MakeSelectiong()
    Dim IE As New InternetExplorer
    Const URL = "http://www.debentures.com.br/exploreosnd/consultaadados/sndemumclique/"
    Const optionText As String = "AALR21"        'Number2
    Application.ScreenUpdating = False           '   a.selectedIndex = 2

    With IE
        .Visible = True
        .navigate URL
        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim a As Object, currentOption As Object
        Set a = .document.getElementById("ctl00_ddlAti")

        For Each currentOption In a.getElementsByTagName("Option")
            If InStr(currentOption.innerText, optionText) > 0 Then
                currentOption.Selected = True
                Exit For
            End If
        Next currentOption
        Stop
        .Quit
    End With
End Sub

按索引选择:

我可以删除整个循环并简单地说:

a.selectedIndex = 2