【发布时间】:2018-07-25 19:52:21
【问题描述】:
我在 vba 中结合 IE 编写了一个脚本,用于单击网页地图上的一些可用点。单击一个点时,会弹出一个包含相关信息的小框。
我想解析每个盒子的内容。可以使用类名contentPane 找到该框的内容。但是,这里主要关注的是通过单击这些点来生成每个框。当一个框出现时,它看起来就像您在下图中看到的那样。
这是我目前尝试过的脚本:
Sub HitDotOnAMap()
Const Url As String = "https://www.arcgis.com/apps/Embed/index.html?webmap=4712740e6d6747d18cffc6a5fa5988f8&extent=-141.1354,10.7295,-49.7292,57.6712&zoom=true&scale=true&search=true&searchextent=true&details=true&legend=true&active_panel=details&basemap_gallery=true&disable_scroll=true&theme=light"
Dim IE As New InternetExplorer, HTML As HTMLDocument
Dim post As Object, I&
With IE
.Visible = True
.navigate Url
While .Busy = True Or .readyState < 4: DoEvents: Wend
Set HTML = .document
End With
Application.Wait Now + TimeValue("00:0:07") ''the following line zooms in the slider
HTML.querySelector("#mapDiv_zoom_slider .esriSimpleSliderIncrementButton").Click
Application.Wait Now + TimeValue("00:0:04")
With HTML.querySelectorAll("[id^='NWQMC_VM_directory_'] circle")
For I = 0 To .Length - 1
.item(I).Focus
.item(I).Click
Application.Wait Now + TimeValue("00:0:03")
Set post = HTML.querySelector(".contentPane")
Debug.Print post.innerText
HTML.querySelector("[class$='close']").Click
Next I
End With
End Sub
当我执行上述脚本时,它看起来运行顺利,但没有任何反应(我的意思是,没有点击)并且它也没有抛出任何错误。最后它优雅地退出浏览器。
这是一个带有信息的框在单击一个点时的样子。
虽然我在脚本中使用了硬编码延迟,但它们可以在宏开始工作后立即修复。
问题:如何单击地图上的每个点并从弹出框中收集相关信息?我只希望有任何使用Internet Explorer
数据不是这里的主要关注点。我想知道 IE 在这种情况下是如何工作的,以便在将来的情况下处理它们。 IE 以外的任何解决方案都不是我想要的。
【问题讨论】:
-
只能用IE解决?
-
总是很高兴在循环中找到你@QHarr。是的,只有
IE,因为我已经使用selenium解决了。谢谢。 -
恐怕这种方式行不通。
circle是SVGCircleElement类型,它没有任何click-event。点击在函数_mouseClick:function(b){...中处理,然后处理。参数b的类型为[object PointerEvent]。也许您最好尝试查看文档here。 -
查看this solution 我将python 与selenium 结合使用,其中点击事件非常完美。不过语言不同!
-
@dee - 实际上,IE 的 SVGCircleElement 上确实存在 Click(因为它最终派生自 Element/IHTMLElement),但它什么也没做。 Topto,你用 IE11 测试过 selenium 的东西吗?
标签: vba excel web-scraping internet-explorer-11