【问题标题】:Importing a table from the web to Excel using VBA使用 VBA 将表格从 Web 导入 Excel
【发布时间】:2012-11-27 11:44:39
【问题描述】:

编写了一些连接到网站的基本 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 事件所需的变量,然后激活该超链接以打开新网页?

然后该表中的每个后续链接?

【问题讨论】:

    标签: javascript excel vba web-scraping dom-events


    【解决方案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
    • 元素.click -- 点击一个元素
    • element.getAttribute("attribute") -- 返回给定属性的值,如hrefstyle

    【讨论】:

    • 我可能是太小气了,只是试图插入你所说的将是我的解决方案。它吐出一个错误。我是否可能需要设置其他变量才能让“ExecScript”执行上面传入的函数?我真的无法理解第二部分。源代码包含几个表,每个表大约有 50 行。我可以很容易地选择我想要的表格,但是除了复制它之外,我不确定接下来的步骤是什么?我正在执行的实际代码/javascript……是通用的吗?我不知道它想做什么?对其他人来说是显而易见的吗?
    • 是的,VBA 并不喜欢 javascript 引入的所有额外字符。 VBA 将这些单引号读取为注释分隔符。让宏点击元素可能会更好。学习如何使用 DOM 方法的最佳方法是打开 Chrome javascript 控制台 (Ctrl + Shift + J) 并尝试不同的代码片段。一旦你学习了一些基本的 javascript,从网页中抓取表格就很容易了。
    • 如果你把你想抓取的网站发给我,我可以帮你开始。
    • 当我在 VBA 中提取字符串时,看起来还不错。引号都完好无损。完全用双引号括起来的任何内容通常都可以,并且被视为字符串。控制台属性框看起来确实很有帮助——但我再一次不知道它在告诉我什么。我从中提取的网站非常机密且受密码保护。我试图用谷歌搜索类似的东西,但到目前为止还没有太多外观。丝网印刷有用吗?非常感谢任何帮助。
    • 或者,这是页面源代码,已编辑。通知中名为“这就是我需要的”部分是我需要从link抓取的链接
    猜你喜欢
    • 2013-03-27
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多