VBA извлекает XML-данные из нескольких веб-сайтов

В моем предыдущем вопросе (в этом вопросе есть все необходимое, ссылка здесь ради полноты и меры) я прошу способ вытащить XML-данные в 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"

... но это когда мы заранее знаем, что нам нужны данные из одного указанного места в Интернете

Что, если мы хотим получить некоторые данные для этих 4 разных местоположений, обозначенных звездочкой (*) на изображении ниже.

Динамическое изменение цели извлечения данных

Как мы могли бы на самом деле ввести наши «координаты» в Excel, скажем, в одну из наших пользовательских форм/ячеек, например, а затем заставить VBA «навигировать/сканировать» там, просто используя эти координаты так же, как мы перемещаемся туда с помощью браузера?

Координаты, которые мы вводим, могут быть:

  • Тикер акций (например, TSLA для Tesla Motors)
  • Тип файлов, например 10-Q's

Вы можете выбрать тип файлов в этих ссылках для BDX и ANN соответственно:

ССЫЛКА BDX

ССЫЛКА ANN

Ниже у нас есть 2 веб-сайта для местоположений экземпляра документа компании BDX и 2 для компании ANN.

Как мы можем извлечь из элемента XML, существующего во всех четырех экземплярах документов, например us-gaap:CommonStockValue, просто предоставив VBA

  1. Тикер акций
  2. Тип документа (10-К, 10-К)

Можно ли это сделать с помощью Microsoft XML Базовые службы (MSXML) или нам нужна еще какая-то библиотека?

Вы можете видеть, насколько непрактично запускать этот код тысячу раз и каждый раз копировать URL-адрес из веб-браузера в strXMLSite в виде строкового значения....


person ExoticBirdsMerchant    schedule 14.02.2014    source источник


Ответы (1)


[править1]

В ответ на комментарий:

единственное, что остается нам, это понять, как на самом деле изменяются URL-адреса, чтобы их можно было предсказать и ими можно было манипулировать путем конкантенации жала? На каком языке кода написан URL?

Краткий ответ: откройте браузер, щелкните правой кнопкой мыши пустое место на интересующей вас веб-странице и выберите View Source во всплывающем меню.

Чтобы повторить пример, приведенный в другом сообщении VBA href Сканирование исходного кода браузера, сделайте следующее:

Откройте онлайн-поиск компаний 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 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, скажем, в одну из наших пользовательских форм/ячеек, например, а затем заставить VBA «навигировать/сканировать» там, просто используя эти координаты так же, как мы перемещаемся туда с помощью браузера?

Я погуглил «получить результаты Google в виде xml», исследуя другой вопрос. Одним интересным ответом была эта ссылка: http://nielsbosma.se/projects/seotools/functions/

Я не делаю никаких заявлений о достоинствах этого инструмента, но, похоже, он обладает той функциональностью, о которой вы просите.

Теперь в предыдущей процедуре мы видим, что нам нужно использовать только оператор strXMLSite = "http://www.sec.gov/Archives/edgar/data/10795/000119312513456802/bdx-20130930.xml" ... но это когда мы заранее знаем, что нам нужны данные из одного указанного места в Интернете

Да, поэтому, как только вы получили какую-то функцию веб-сканирования, чтобы вернуть список ссылок на документы 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  

Интересный вопрос в целом, и я был рад дать вам отзыв о коде, который вы разместили. На другие ваши вопросы, вероятно, можно ответить, выполнив небольшой поиск в Google.

person Brandon R. Gates    schedule 14.02.2014
comment
мои друзья, я сейчас дома, но я буду очень вежливо отвечать, как только у меня будет время, потому что это невозможно с моего мобильного - person ExoticBirdsMerchant; 15.02.2014
comment
Уважаемый Брэндон, не могли бы вы увидеть в Codo, кто пытается сделать то же самое? в своем сообщении в stackoverflow.com/questions/21787036/vba-network- веб-сканирование, он объясняет этот вопрос намного лучше меня. Видишь, у нас такая же проблема - person ExoticBirdsMerchant; 15.02.2014
comment
Я также видел SeoTools, я вижу некоторые имена тегов разметки, я думаю, но не могу получить ничего больше ... что это за HTML? По сути, параметризация значения String не является проблемой. Если вы увидите ссылку, которую я вам дал, вы увидите более подробно нашу проблему. - person ExoticBirdsMerchant; 15.02.2014
comment
Как вы думаете, что я должен искать в Google? Является ли это веб-сканированием, которое я пытаюсь сделать, поскольку я просто пытаюсь узнать, как составлен URL-адрес, чтобы я мог манипулировать строковым значением, или у него есть другая терминология? Можно ли это сделать исключительно на VBA? - person ExoticBirdsMerchant; 15.02.2014
comment
Да, я видел другой пост от @Codo, но до того, как он расширил его. Похоже, вы оба работаете над одним проектом. Я предложил поискать в Google, потому что это 1) что-то, что уже было сделано другими, и 2) многие из этих людей, вероятно, поделились частью своего кода или 3) возможно, у вас уже есть полный и доступный пакет для использования. - person Brandon R. Gates; 16.02.2014
comment
Дорогой Брэндон, единственное, что нам осталось, это понять, как на самом деле изменяются URL-адреса, чтобы их можно было предсказать и ими можно было манипулировать путем конкантенации жал? На каком языке кода написан URL? - person ExoticBirdsMerchant; 16.02.2014
comment
Нам не нужен готовый пакет, потому что его нет для того, что нам нужно: полностью настраиваемая финансовая модель... единственное, что мы не можем получить, это то, как тикает URL. - person ExoticBirdsMerchant; 16.02.2014
comment
Теперь, когда мне ясно, что вам нужны именно данные EDGAR, на самом деле существует по крайней мере один API для получения XML-данных и загрузки в Excel: xignite.com/market-data/ Это платная услуга, но они предлагают 7-дневную бесплатную пробный. API подразумевает, что вы можете использовать его для написания любого приложения по вашему выбору. - person Brandon R. Gates; 16.02.2014
comment
Уважаемый Брэндон Р. Гейтс, я знаю о xignite. Их сервис меня не интересует по конкретным соображениям прозрачности данных. Ну, мне не нужны данные именно от ЭДГАРА. EDGAR — это только начало... quant.stackexchange.com/questions/141/, поэтому мне нужно разработать функциональность - person ExoticBirdsMerchant; 16.02.2014
comment
Теперь этот ответ займет долгий путь @Brandon R. Gates - person ExoticBirdsMerchant; 16.02.2014