1

在我之前的问题中(需要的一切都在这个问题上;为了完整和衡量,此处提供了链接)我要求一种将 XML 数据从 Web 位置拉到 Excel 的方法。我收到的代码(由user2140261提供)作为答案在这里:

Sub GetNode()
Dim strXMLSite As String
Dim objXMLHTTP As MSXML2.XMLHTTP
Dim objXMLDoc As MSXML2.DOMDocument
Dim objXMLNodexbrl As MSXML2.IXMLDOMNode
Dim objXMLNodeDIIRSP As MSXML2.IXMLDOMNode

Set objXMLHTTP = New MSXML2.XMLHTTP
Set objXMLDoc = New MSXML2.DOMDocument

strXMLSite = "http://www.sec.gov/Archives/edgar/data/10795/000119312513456802/bdx-20130930.xml"

objXMLHTTP.Open "POST", strXMLSite, False
objXMLHTTP.send
objXMLDoc.LoadXML (objXMLHTTP.responseText)

Set objXMLNodexbrl = objXMLDoc.SelectSingleNode("xbrl")

Set objXMLNodeDIIRSP = objXMLNodexbrl.SelectSingleNode("us-gaap:DebtInstrumentInterestRateStatedPercentage")

Worksheets("Sheet1").Range("A1").Value = objXMLNodeDIIRSP.Text
End Sub  

但是每家公司都有不同的 XML 实例文档,并且公司在每个时间段发布不同的 XML 实例文档(例如,每季度、每年)。因此,可以在不同的Web 位置访问这些文档。

现在在前面的过程中我们可以看到我们只需要使用语句

strXMLSite = "http://www.sec.gov/Archives/edgar/data/10795/000119312513456802/bdx-20130930.xml"

...但这是当我们事先知道我们需要来自 Web 中一个指定位置的数据时

如果我们想为下图中用星号 (*) 描绘的这 4 个不同位置提取一些数据怎么办?

动态改变数据拉取目标

我们如何在 Excel 中实际输入我们的“坐标”,例如在我们的一个用户窗体/单元格中,然后使用这些坐标使 VBA 在那里“导航/爬行”,就像我们使用浏览器导航一样?

我们输入的坐标可以是:

  • 股票代码(例如特斯拉汽车的 TSLA)
  • 一种文件类型,例如 10-Q's

您可以在这些链接中分别为 BDX 和 ANN 选择文件类型:

BDX 链接

安链接

下面我们有 2 个 Web 位置用于 BDX 公司的 Instance Document 位置,2 个用于 ANN 公司

我们如何从所有四个实例文档中都存在的 XML 元素中提取,例如us-gaap:CommonStockValue通过简单地给 VBA

  1. 股票行情
  2. 文件类型(10-K、10-Q)

是否可以使用Microsoft XML Core Services (MSXML)来完成,或者我们也需要一些其他库?

您可以看到触发此代码数千次并且每次都将 URL 从 Web 浏览器复制到 strXMLSite 作为字符串值是多么不切实际......

4

1 回答 1

1

[编辑1]

回应评论:

我们唯一剩下的就是了解 URL 的实际变化情况,以便可以通过 sting 连接来预测和操纵它们?URL 是用什么代码语言编写的?

简短的回答是打开浏览器并右键单击您感兴趣的网页中的空白处,然后View Source从弹出菜单中选择。

要重复另一篇文章VBA href Crawl on Browser's Source Code中提供的示例,请执行以下操作:

在浏览器中打开 Edgar 在线公司搜索:https ://www.sec.gov/edgar/searchedgar/companysearch.html

使用快速搜索功能搜索股票 CRR,它给了我这个 URL:https ://www.sec.gov/cgi-bin/browse-edgar?CIK=CRR&Find=Search&owner=exclude&action=getcompany其中包含公共列表Carbo Ceramics, Inc. 的文件

现在,右键单击页面以获取源代码并向下滚动到第 91 行。您将看到以下代码块:

      <table class="tableFile2" summary="Results">

这是显示公开文件列表的结果表的开头。

         <tr>
            <th width="7%" scope="col">Filings</th>
            <th width="10%" scope="col">Format</th>
            <th scope="col">Description</th>
            <th width="10%" scope="col">Filing Date</th>
            <th width="15%" scope="col">File/Film Number</th>
         </tr>

那是带有列描述的表格的标题行。

<tr>
<td nowrap="nowrap">SC 13G</td>
<td nowrap="nowrap"><a href="/Archives/edgar/data/1009672/000108975514000003/0001089755-14-000003-index.htm" id="documentsbutton">&nbsp;Documents</a></td>
<td class="small" >Statement of acquisition of beneficial ownership by individuals<br />Acc-no: 0001089755-14-000003&nbsp;(34 Act)&nbsp; Size: 8 KB            </td>
            <td>2014-02-14</td>
            <td nowrap="nowrap"><a href="/cgi-bin/browse-edgar?action=getcompany&amp;filenum=005-48851&amp;owner=exclude&amp;count=40">005-48851</a><br>14615563         </td>
         </tr>

这就是备案表中的第一行实际数据SC 13GStatement of acquisition of beneficial ownership by individuals Acc-no: 0001089755-14-000003 (34 Act) Size: 8 KB, 提交于2014-02-14

所以,现在您想遍历此页面上的所有文档 URL,这就是为什么您要问这些 URL 使用什么语言?(换句话说,抓取页面?)

[开始原始答案]

我们如何在 Excel 中实际输入我们的“坐标”,例如在我们的一个用户窗体/单元格中,然后使用这些坐标使 VBA 在那里“导航/爬行”,就像我们使用浏览器导航一样?

我在研究另一个问题时搜索了“以 xml 形式获取谷歌结果”。回来的一个有趣的点击是这个链接: http: //nielsbosma.se/projects/seotools/functions/

我没有说明这个工具的优点,但它似乎具有您所要求的功能。

现在在前面的过程中我们可以看到我们只需要使用语句 strXMLSite = " http://www.sec.gov/Archives/edgar/data/10795/000119312513456802/bdx-20130930.xml " ...但这是当我们事先知道我们需要来自 Web 中一个指定位置的数据时

是的,所以一旦你获得了某种网络爬取功能来返回一个 xml 文档链接列表,你首先需要将它们放在用户可以看到的地方。我的偏好是工作表上的范围,但您也可以在表单中加载列表或组合框。无论如何,您将Sub GetNode()根据用户选择进行修改以接受输入参数:

Sub GetNode(strUrl as String)
...
strXMLSite = strUrl
...
Worksheets("Sheet1").Range("A1").Value = objXMLNodeDIIRSP.Text
End Sub  

或者也许更好地将它作为一个函数返回 xml 作为文本供您使用,但是您想要:

Function GetNode(strUrl as String) as String
...
strXMLSite = strUrl
...
'return result
GetNode = objXMLNodeDIIRSP.Text
End Function  

总体而言,这是一个有趣的问题,我很高兴就您发布的代码向您提供反馈。您的其他问题可能可以通过做一些谷歌搜索来回答。

于 2014-02-14T21:56:29.840 回答