【发布时间】:2018-11-02 08:17:53
【问题描述】:
我正在尝试从网页中抓取数据。在这个过程中,我需要改变一个 该网页的下拉菜单。我能够做到这一点。但是当我手动更改 下拉菜单,网页会更改其内容,例如图像和其他一些文本。但是当我这样做时 使用 VBA 它不会那样做。我多次测试了我的代码。所以如果我运行程序 10 次它将更改内容 1 或 2 次。所以我对发生的事情感到困惑
这是该下拉区域的 HTML。
<tbody>
<tr>
<td class="label"><label for="pa_product">Product</label></td>
<td class="value"><select id="pa_product" name="attribute_pa_product" data-attribute_name="attribute_pa_product">
<option value="">Choose an option…</option>
<option value="air-xs-2-octo-16-inch" class="attached enabled">AIR XS 2 Octo 16 Inch</option>
<option value="air-xs-2-octo-18-inch" class="attached enabled">AIR XS 2 Octo 18 Inch</option>
<option value="air-xs-2-octo-20-inch" class="attached enabled">AIR XS 2 Octo 20 Inch</option>
</select> <a class="reset_variations" href="#reset">Clear selection</a></td>
</tr>
</tbody>
这是我开发的代码。我认为 onchange 和 onclick 很少起作用。
Do
DoEvents
Loop Until objIE.readystate = 4
'Body(HTML)
'MsgBox objIE.document.getElementById("tab-description").outerHTML, , "OHTML"
'MsgBox objIE.document.getElementById("tab-description").innerHTML, , "IHTML"
'MsgBox objIE.document.getElementById("tab-description").innerText, , "ITex"
WS.Range("D" & i).Value = objIE.document.getElementById("tab-description").outerHTML
'Option 1 value
'MsgBox objIE.document.getElementById("pa_product").outerHTML
'MsgBox objIE.document.getElementById("pa_product").innerHTML
'MsgBox objIE.document.getElementById("pa_product").innerText
objIE.document.getElementById("pa_product").selectedindex = 1
Application.Wait (Now + TimeValue("0:00:01"))
'modify the web page for that selected item
'For x = 1 To 5
'objIE.document.getElementById("pa_product").selectedindex = 1
Application.Wait (Now + TimeValue("0:00:03"))
objIE.document.getElementById("pa_product").FireEvent ("onchange")
objIE.document.getElementById("pa_product").FireEvent ("Onclick")
objIE.document.getElementById("pa_product").FireEvent ("onmousedown")
'Next x
Application.Wait (Now + TimeValue("0:00:03"))
WS.Range("J" & i).Value = objIE.document.getElementById("pa_product").Item(1).innerText
onchange and onclick not work consistantly
首先我使用了一个事件。但没有成功。所以我尝试使用我发现的所有事件。 FireAllEvents (objIE.document.getElementById("pa_product")) 函数 FireAllEvents(ByRef objHTML)
Function FireAllEvents(ByRef objHTML)
With objHTML
.FireEvent ("onblur")
.FireEvent ("onchange")
.FireEvent ("oncontextmenu")
.FireEvent ("onfocus")
.FireEvent ("oninput")
.FireEvent ("onreset")
'.FireEvent ("onsearch")
.FireEvent ("onkeydown")
.FireEvent ("onkeypress")
.FireEvent ("onkeyup")
.FireEvent ("onclick")
End With
End Function
然后我这样调用这个函数
FireAllEvents (objIE.document.getElementById("pa_product"))
Application.Wait (Now + TimeValue("0:00:03"))
WS_Oceanic.Range("J" & i).Value = objIE.document.getElementById("pa_product").Item(1).innerText
objIE.document.getElementById("pa_product").Click
但它也没有用。
非常感谢你。
【问题讨论】:
-
有可以分享的网址吗?您是否还引入了足够长的等待内容更新的时间?事件之间有足够的时间吗?所有这些活动都需要吗?
-
非常感谢您的回复。这是网页。 oceanicaus.com.au/products/oceanic-airxs-2-octopus
-
你做了什么选择?您是否可以安装第 3 方开源软件,即 selenium basic?
-
感谢您的回复。 selenium basic有官方网站吗?
-
我的答案中包含了链接。
标签: javascript excel vba web scrape