VBA从多个Web位置提取XML数据

在我之前的问题中 (所有需要的都是关于这个问题的;这里的链接是为了完整和度量)我要求一种将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实例文档(例如每季度,每年)。 所以这些文件可以在不同的网站上访问。

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

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

…但是这是当我们事先知道我们想从Web中的一个指定位置获取数据的时候

如果我们想要在下面的图片中为星号(*)所描绘的这4个不同位置提供一些数据

动态更改数据拉取目标

我们怎么能在Excel中input我们的“坐标”,比如说,在我们的一个用户表单/单元格中,然后使用这些坐标就可以使VBA“导航/抓取”,就像我们在浏览器中一样?

我们input的坐标可以是:

  • 股票代码(例如Tesla Motors的TSLA)
  • 一种types的文件,例如10-Q's

您可以分别select这些BDX和ANN链接中的文件types:

BDX LINK

ANN LINK

下面我们有BDX公司实例文档位置2个,ANN公司2个

  • BDX公司

    http://www.sec.gov/Archives/edgar/data/10795/000119312514042815/bdx-20131231.xml http://www.sec.gov/Archives/edgar/data/10795/000119312513318898/bdx-20130630.xml

  • ANN公司

    http://www.sec.gov/Archives/edgar/data/874214/000087421413000036/ann-20131102.xml http://www.sec.gov/Archives/edgar/data/874214/000087421413000027/ann-20130803.xml

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

  1. 股票行情
  2. 文档types(10-K,10-Q)

可以使用Microsoft XML核心服务(MSXML)来完成,还是需要其他一些库?

你可以看到这是多么不切实际的是这个代码被激活了几千次,并且每次都把URL从网页浏览器复制到strXMLSite作为一个string值。

[EDIT1]

回应评论:

唯一留给我们的是了解URL如何实际改变,以便可以通过强制协调来预测和操纵URL? 用什么代码语言写的URL?

简短的答案是打开一个浏览器,并右键单击您感兴趣的网页上的空白处,然后从popup菜单中selectView Source

要重复另一个VBA href在浏览器源代码抓取中提供的示例,请执行以下操作:

打开埃德加在线公司在浏览器中search: https : //www.sec.gov/edgar/searchedgar/companysearch.html

使用快速searchfunction来search股票代码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 13G表中实际数据的第一行, Statement of acquisition of beneficial ownership by individuals Acc-no: 0001089755-14-000003 (34 Act) Size: 8 KB ,于2014-02-14提交。

那么,现在你想循环浏览这个页面上的所有文档URL,这就是为什么你要问这个URL是在什么语言的? (抓取页面,换句话说?)

[开始原创]

我们怎么能在Excel中input我们的“坐标”,比如说,在我们的一个用户表单/单元格中,然后使用这些坐标就可以使VBA“导航/抓取”,就像我们在浏览器中一样?

在search另一个问题时,我search了“以googlesearch结果为xml”。 一个有趣的回击是这个链接: http : //nielsbosma.se/projects/seotools/functions/

我没有表示这个工具的优点,但它似乎有你要求的function。

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

是的,所以一旦你已经获得了某种types的web爬行函数来返回一个xml文档链接列表,你首先需要把它们放在用户可以看到的地方。 我的首选项是工作表上的一个范围,但是也可以在表单中加载一个列表或combobox。 无论如何,你可以修改Sub GetNode()来接受一个基于用户select的input参数:

 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 

总的来说,有趣的问题,我很高兴给你发布你的代码的反馈。 你的其他问题可以通过做一些谷歌search来回答。