【问题标题】:excel web query in vbavba中的excel网页查询
【发布时间】:2015-09-17 07:17:10
【问题描述】:

我有一个当前使用 Yahoo Finance API 和 MSXML 更新大约 200 只股票的工作表。我还想从其他没有 api 的网站获取一些其他信息,例如“http://www.earningswhisper.com/stocks.asp?symbol=googl”。

此外,如果您查看下面该网页的一些信息,您会看到发布日期为 2015 年 1 月 29 日。中间还有一些文本,目前是“[未确认]”,但在某些时候它会变为“[确认]”,并且这两个文本项都很有趣。

由于缺乏更好的网络技能,我目前有一个带有 QueryTable 的单张表,该表在代码中同步刷新。它工作......最终。我宁愿使用代码中的响应,但我不知道该怎么做。我不需要自动刷新这些特定信息。

问题

  1. 是否有首选的 VBA 方式处理 html 响应?可以给个代码sn-p来说明吗?
  2. 是否可以相对容易地将html转换为xml或json?代码 sn-p?
  3. 如果 QueryTable 实际上是足够好的解决方案,那么使用事件为每个股票创建一个工作表并异步刷新会更快吗?

我知道网络上有大量信息,但其中大部分似乎过时且令人困惑。我正在使用 Excel 2013。

我可以使用 html 并抓取 Table(6) 获取我想要的数据,如下面的代码所示。我想我可以解析 InnerText,但我怀疑有一种更简单的方法可以从该表中获取我需要的元素。

Sub TestHtml()
   Dim Resp, sText, FirstCode As String
   Dim oHttp, oFile, oTable As Object
   Dim lines As Variant

   Set oHttp = CreateObject("Microsoft.XMLHttp")
   oHttp.Open "GET", "http://www.earningswhisper.com/stocks.asp?   symbol=googl", False
   oHttp.send ("")
   Resp = oHttp.responseText
   Set oFile = CreateObject("htmlfile")
   oFile.Write Resp
   Set oTable = oFile.getElementsByTagName("Table")(6)
   sText = oTable.innertext
   MsgBox sText
End Sub

这是该表中的一行,以及下面的完整表。

<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'">
  <td width="67%" align=left valign=middle>&nbsp;Release Date: <font color='#505050'><small>[not confirmed]</small></font>
  </td>
  <td width="33%" align=right valign=middle><a href="calendar.asp?day=-5">1/29/2015</a> &nbsp;</td>
</tr>

使用 VBA 代码深入了解表中的元素的最佳方法是什么?

<TABLE cellpadding=1 cellspacing=0 border=0 id=QEsts width="100%" bgcolor="#505050"><tr><td><TABLE cellpadding=2 cellspacing=0 border=0 width="100%" bgcolor="#FFFFFF" height='148'><tr><td valign=top>
<table cellpadding=0 cellspacing=0 border=0 width="100%" class='newsart'>
<tr><td colspan="2" bgcolor="#FFFFFF"><table width="100%" bgcolor="#FFFFFF" cellpadding=1 cellspacing=0 border=0><tr><td style="background-image: url('images/headbar2.gif'); background-color: #000000; BORDER-RIGHT: #000000 thin solid; BORDER-TOP: #000000 thin solid; FONT-WEIGHT: bold; FONT-SIZE: 12px; MARGIN: 2px; BORDER-LEFT: #000000 thin solid; COLOR: #e1b64b; BORDER-BOTTOM: #000000 thin solid; FONT-FAMILY: Arial;">&nbsp; 4th Quarter Ending December 2014</td></tr></table></td></tr>
<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'"><td width="67%" align=left valign=middle> &nbsp;<b>Earnings Whisper</b> <small>&#174</small>: </td><td width="33%" align=right valign=middle><b>$7.24</b> &nbsp;</td></tr>
<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'"><td width="67%" align=left valign=middle> &nbsp;Consensus Estimate:</td><td width="33%" align=right valign=middle>$7.16 &nbsp;</td></tr>
<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'"><td width="67%" align=left valign=middle> &nbsp;Surprise Expectation <small><sup>1</sup></small>: </td><td width="33%" align=right valign=middle> &nbsp;</td></tr>
<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'"><td width="67%" align=left valign=middle> &nbsp;Release Date: <font color='#505050'><small>[not confirmed]</small></font></td><td width="33%" align=right valign=middle><a href="calendar.asp?day=-5">1/29/2015</a> &nbsp;</td></tr>
<tr><td width="100%" align=right colspan="2" valign=middle>After Close &nbsp;</td></tr>
<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'"><td width="67%" align=left valign=middle> &nbsp;Expected Time <small><sup>2</sup></small>: </td><td width="33%" align=right valign=middle>N/A &nbsp;</td></tr>
<tr onMouseover="this.className='newsart_s2'" onMouseOut="this.className='newsart'"><td width="67%" align=left valign=top> &nbsp;Conference Call: </td><td width="33%" align=right valign=top>4:30 PM ET &nbsp;<small><br> &nbsp;</small></td></tr>
</table>
</td></tr></TABLE></td></tr></TABLE>

</td>

【问题讨论】:

  • 您最好还是想办法一次下载所有内容。如果您使用 100 多只股票,则为每只股票创建一张表格将是一个非常糟糕的主意。我会避免尝试在 Excel 中异步执行操作。我已经以这种方式实施了解决方案,但我总是在以后放弃它们,因为它们太容易出错了。
  • 我希望我也能立即完成。该网站有很好的财务信息,但没有 API 可以做到这一点..
  • 你可以通过DOM解析html响应交互,只需push the response into htmlfile ActiveX,然后你可以使用.document.getElementsByTagName()等。注意这个ActiveX有限制,所以没有JS会运行(用于 DOM 节点创建/重建,也不用于 HTTP 请求)。如果页面使用 JS 并在加载后自行修改,唯一的方法是检查浏览器中的 JS 活动(例如 HTTP 请求)并找出可以接收和进一步处理的数据。

标签: excel web-scraping vba


【解决方案1】:

您可以与 DOM 交互,因为您成功创建了该对象,但您知道在您的情况下,从上表中获取必要值的最简单方法是将 InnerText 解析为字符串,请尝试以下代码:

aTmp0 = Split(sText, "Release Date:")
If Ubound(aTmp0) = 1 Then
    aTmp1 = Split(aTmp0(1), "Expected Time")
    MsgBox aTmp1(0)
Else
    MsgBox "Release Date not found"
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多