【问题标题】:scraping a tab within a website using vba使用 vba 在网站中抓取标签
【发布时间】:2016-11-18 07:03:55
【问题描述】:

我正在尝试单击网站中的一个选项卡,该选项卡由似乎是鼠标事件的事件激活。这是html的sn-p:

<frame name ="nav">
<body><div id="tab2flyover0" 
onmouseover="document.getElementById('tab2flyover0DivShim').style.width = document.getElementById('tab2flyover0').offsetWidth;
onmouseout="document.getElementById('tab2flyover0').style.visibility='hidden';document.getElementById('tab2flyover0DivShim')
onmouseover="document.getElementById('tab2_tab2Cell0')onmouseout="document.getElementById('tab2_tab2Cell0')
onclick="parent.frames[0].changeTopTabs('tab2TableDetail') parent.frames[0].changeContentFrame('/MISO/DART/selectDARTParticipant.do');">    
<p id="tab2_tab2flyover0text0" style="color: rgb(255, 153, 0);">Select Party</p>

代码标签“p”的最后一行是我“检查元素”时需要用到的地方。

下面是到目前为止我的 vba 代码的 sn-p:

Sub scrape()
Dim htmldoc As MSHTML.IHTMLDocument 'Document object
Dim eleColtr As MSHTML.IHTMLElementCollection 'Element collection for tr tags
Dim eleColtd As MSHTML.IHTMLElementCollection 'Element collection for td tags
Dim eleRow As MSHTML.IHTMLElement 'Row elements
Dim eleCol As MSHTML.IHTMLElement 'Column elements
Dim ieURL As String 'URL

Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True   
With ie
.
Shell "wscript.exe ""C:\Users\Ar\Desktop\vbscript.vbs"""
        Do Until .readyState = 4
DoEvents
Loop
Set htmldoc = ie.document
Set dar = htmldoc.frames("nav").document.getElementById("tab2_tab2flyover0text0")
dar.Click
Do Until .readyState = 4
DoEvents
Loop
Application.Wait (Now + TimeValue("00:00:02"))
.document.forms(0).submit
End With
End Sub

我收到的错误是:“对象 JScriptTypeInfo 的方法‘框架’失败”。

我以前从未处理过鼠标事件,所以也许这就是我遇到问题的地方?

【问题讨论】:

  • 需要更多代码...
  • Tim,我已经包含了所有的 vba 代码,谢谢!
  • 错误出现在“Set dar”行。
  • 你到底想做什么?我认为问题的标题需要改进。
  • 我基本上只是想点击网站中的一个标签。将鼠标悬停在选项卡上时会拉出一个菜单。因此,我需要从将鼠标悬停在选项卡上后拉出的菜单中单击一个项目。将鼠标悬停在标签上后,我无法单击弹出的菜单。

标签: javascript html vba


【解决方案1】:

带有onclick事件的标签就是标签

<div id="tab2flyover0">

您正在选择以下标签并单击:

<p id="tab2_tab2flyover0text0" style="color: rgb(255, 153, 0);">Select Party</p>

我会将代码更改为以下代码并重试,我最近做了类似的事情并且没有任何问题。 (使用 Powershell 而不是 VBA)

Set dar = htmldoc.frames("nav").document.getElementById("tab2flyover0")

【讨论】:

  • 不幸的是,我在使用 tab2flyover0 时遇到了同样的错误:“方法 'frames' of object JScriptTypeInfo' failed”。我最初选择了 p 标签,因为这是我单击菜单时检查元素突出显示的地方。还有其他想法吗?
  • 试试这个设置 dar = htmldoc.getElementById("tab2flyover0")
  • 它给了我一个“类型不匹配”错误。知道为什么会这样吗?
  • 很难自己调试。在 Powershell 中执行此操作时我注意到的一件事是我必须以管理员身份运行 powershell。仔细研究一下,因为你有一个框架,我认为你正确地引用了框架文档。也许我应该寻找一个有框架的网站来测试......
  • 好的,如果您有任何进一步的建议,请告诉我,感谢您的帮助!
【解决方案2】:

证明很难找到同时使用框架的网站。但我会进一步分解代码以进行调试。例如。 添加框架文档的声明。

Dim frameDoc As MSHTML.IHTMLDocument

然后拆线:

Set dar = htmldoc.frames("nav").document.getElementById("tab2flyover0")

进入

Set frameDoc = htmldoc.frames("nav").document
Set Dar = frameDoc.getElementById("tab2flyover0")

您还没有声明 dar 的类型。 然后检查错误发生在哪一行代码。

【讨论】:

  • 对我上一条评论的更正,错误实际上是:“对象'JScriptTypeInfo'的方法'frames'失败”。
  • 签出这个,看起来你需要将框架声明为 MSHTML.htmlwindows2 然后一旦设置了第二个窗口,你应该能够从中获取你需要的数据。我无法测试,因为没有要测试的框架和 id 标签的站点:stackoverflow.com/questions/26347286/…
猜你喜欢
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多