使用VBA将网页表格导入Excel

4

我编写了一些基本的VBA代码,可以连接到一个网站,输入用户名和密码登录该网站,然后将一个表格复制并粘贴到Excel中。现在我意识到我的表格包含带链接的图形。我不想再复制之前提到的表格,而是想单独跟随这些链接,并将这些链接指向的表格复制到Excel中。

然而,这个网页表格中的图形没有单独的直接超链接。我查看了网页源代码,发现它包含JavaScript。(见下文)

 <a href="#" onclick="var a=function(){javascript:window.open('','ProcStatus','top=50,left=' +     (screen.width - 750) + ',width=700,height=500,resizable,status,scrollbars');};var b=function()    {if(typeof jsfcljs == 'function'){jsfcljs(document.getElementById('MainPage'),        {'j_id202:319:j_id208':'j_id202:319:j_id208'},'ProcStatus');}return false};return (a()==false) ?     false : b();"><img src="image.gif" alt="View Details" style="border: 0;" title="View Details" /></a>

我可以在源代码中看到这些函数的功能,考虑到我对JavaScript一无所知,我的VBA代码如何执行/打开这些链接,然后移动到表格中的第二行,到下一个链接?基本上,我如何填充 onclick 事件所需的变量,然后激活超链接以打开新的网页?
接着,如何处理表格中每个后续链接?
1个回答

1
您可以使用以下方法从VBA调用JavaScript函数:
Call ie.document.parentWindow.execScript("functionName()", "JavaScript")

在您的情况下,它会看起来像这样:
Call ie.document.parentWindow.execScript("var a=function(){javascript:window.open('','ProcStatus','top=50,left=' +     (screen.width - 750) + ',width=700,height=500,resizable,status,scrollbars');};var b=function()    {if(typeof jsfcljs == 'function'){jsfcljs(document.getElementById('MainPage'),        {'j_id202:319:j_id208':'j_id202:319:j_id208'},'ProcStatus');}return false};return (a()==false) ?     false : b();", "JavaScript")

或者,您也可以使用DOM方法指示您的宏单击链接。您将不得不深入源代码以找出元素的确切位置,但通常情况下,您的代码将如下所示:

ie.document.getElementsByTagName("a")[3].click

其中3是“a”元素数组的索引。

您不需要了解太多JavaScript就可以有效地进行网页抓取,但了解一些基本的DOM方法会有所帮助。

  • document.getElementsByTagName -- 查找具有给定标记名称(如tableatdtrdiv等)的元素。
  • document.getElementsByName -- 查找具有给定名称的元素
  • document.getElementById -- 查找具有给定ID的元素
  • element.innerText -- 返回元素的文本
  • element.innerHTML -- 返回元素的HTML
  • element.click -- 单击元素
  • element.getAttribute("attribute") -- 返回给定属性的值,如hrefstyle

我可能太天真了,试图只是插入你说的解决方案。它会报错。 我是否需要设置其他变量才能使“ExecScript”执行上面传递的函数?我无法真正理解第二部分。源代码包含几个表格,每个表格大约有50行。我可以轻松地选择所需的表格,但除了复制它之外,我不确定下一步该怎么做?我正在执行/ JavaScript的实际代码......它是通用的吗?我不知道它试图做什么?对其他人来说很明显吗? - Marcus C
如果你把你想要爬取的网站发给我,我可以帮你入门。 - fbonetti
要遍历该表中的每个链接,只需将 getElementsByTagName("tr")(0) 更改为 getElementsByTagName("tr")(i) 并迭代 i = 0 到 10。 - fbonetti
如果你想要那个特定的数字,你可以这样做:document.getElementById("VRN_3").innerText - fbonetti
干杯。我找到了一些代码。 '对于winShell.Windows中的每个ie 如果 Right(ie.LocationURL, 14) = urlToLookFor Then ie.Visible = False Set retVal = ie Exit For End If下一个' 它似乎解决了问题。这意味着我可以指向第二个Internet Explorer弹出窗口,然后在它们之间切换选项卡。非常感谢你的帮助。 - Marcus C
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接