Удаление таблицы с веб-сайта с использованием VBA - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в VBA и на веб-сайте.

Я пытаюсь получить данные (таблицу) с веб-сайта ниже для использования в коде VBA.

http://www.bkam.ma/Marches/Principaux-indicateurs/Marche-obligataire/Marche-des-bons-de-tresor/Marche-secondaire/Taux-de-reference-des-bons-du-tresor?date=13%2F02%2F2019&block=e1d6b9bbf87f86f8ba53e8518e882982#address-c3367fcefc5f524397748201aee5dab8-e1d6b9bbf87f86f8ba53e8518e882982

Я попытался создать браузер Internet Explorer:

Dim appIE As Object
Set appIE = CreateObject("internetexplorer.application")

With appIE
    .Navigate "http://www.bkam.ma/Marches/Principaux-indicateurs/Marche-obligataire/Marche-des-bons-de-tresor/Marche-secondaire/Taux-de-reference-des-bons-du-tresor?date=13%2F02%2F2019&block=e1d6b9bbf87f86f8ba53e8518e882982#address-c3367fcefc5f524397748201aee5dab8-e1d6b9bbf87f86f8ba53e8518e882982"
    .Visible = True
End With

Do While appIE.Busy
    DoEvents
Loop

Затем я попытался использовать свойства идентификатора или тэга для получения данных

Set val = appIE.document.getElementById()

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

                              </span>
                                           </div>
                                       </th>
                                                                                                                                                                                        </tr>
                            </thead>
                            <tbody>
                                                
                                                                                         
                                                                                                                                                                                    <tr>
                             
         <td>18/03/2019</td>
      
         <td><span class="number">20,05</sapn>&nbsp;<span class="symbol"></span></td>
      
         <td><span class="number">2,250</sapn>&nbsp;<span class="symbol">%</span></td>
      
         <td>13/02/2019</td>
      
    
                             </tr>
                        
                                             

В этом фрагменте показана первая строка таблицы, которую я пытаюсь извлечь.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Сначала вы можете найти таблицу на основе ее атрибута класса

Set HTMLTable = appIE.document.getElementsByClassName("dynamic_contents_ref_12")(0)

. Он получит массив элементов HTML с именем класса dynamic_contents_ref_12 и вернет его первый элемент.

Затем вы можете «сканировать» таблицу, используя атрибут `.Children`

Это даст вам первую строку:

Set TBody = HTMLTable.Children(1) 'The <tbody> tag is the second child
Set Row1 = TBody.Children(0)      'The first <tr> inside the <tbody> tag

Для каждой строки поместите в скобки разные индексы.

Теперь HTML внутри Row1 выглядит как

<tr>

  <td>
    18/03/2019
  </td>

  <td>
    <span class="number">
      20,05&nbsp;
      <span class="symbol"></span>
    </span>
  </td>

  <td>
    <span class="number">
      2,250&nbsp;
      <span class="symbol">%</span>
    </span>
  </td>

  <td>
    13/02/2019
  </td>

</tr>

(каждый <td> - это ячейка в строке.)

Чтобы получить текст внутриВ ячейке мы можем использовать метод .innerText, который возвращает строку:

CellA1 = Row1.Children(0).innerText ' = "05/04/2019"
CellB1 = Row1.Children(1).innerText ' = "43,85 "

Собираем все вместе

Используя цикл For Each, мы можем получить все ячейки из HTMLтаблица и скопировать их на лист - предположим, вы хотите начать с ячейки A1 .

'Table Headers
ActiveSheet.Range("A1").Value = "Date d'échéance"
ActiveSheet.Range("B1").Value = "Transaction"
ActiveSheet.Range("C1").Value = "Taux moyen pondéré"
ActiveSheet.Range("D1").Value = "Date de la valeur"

Set HTMLTable = appIE.document.getElementsByClassName("dynamic_contents_ref_12")(0)
Set TBody = HTMLTable.Children(1)
RowIndex = 2
For Each Row in TBody.Children
  ActiveSheet.Cells(RowIndex, 1).Value = Row.Children(0).innerText
  ActiveSheet.Cells(RowIndex, 2).Value = Row.Children(1).innerText
  ActiveSheet.Cells(RowIndex, 3).Value = Row.Children(2).innerText
  ActiveSheet.Cells(RowIndex, 4).Value = Row.Children(3).innerText
  RowIndex = RowIndex + 1
Next
0 голосов
/ 21 февраля 2019

Вы можете отключить браузер и использовать xmlhttp для получения содержимого страницы, затем выбрать элемент таблицы по его классу (идентификатор не используется, а класс является следующим самым быстрым селектором после идентификатора), а затем выполнить цикл записи строк и столбцов.на лист.

Option Explicit
Public Sub GetTable()
    Dim html As MSHTML.HTMLDocument, hTable As Object, ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set html = New MSHTML.HTMLDocument                  '<  VBE > Tools > References > Microsoft Scripting Runtime
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://www.bkam.ma/Marches/Principaux-indicateurs/Marche-obligataire/Marche-des-bons-de-tresor/Marche-secondaire/Taux-de-reference-des-bons-du-tresor?date=13%2F02%2F2019&block=e1d6b9bbf87f86f8ba53e8518e882982#address-c3367fcefc5f524397748201aee5dab8-e1d6b9bbf87f86f8ba53e8518e882982", False
        .send
        html.body.innerHTML = .responseText
    End With
    Set hTable = html.querySelector(".dynamic_contents_ref_12")
    Dim td As Object, tr As Object, th As Object, r As Long, c As Long
    For Each tr In hTable.getElementsByTagName("tr")
        r = r + 1: c = 1
        For Each th In tr.getElementsByTagName("th")
            ws.Cells(r, c) = th.innerText
            c = c + 1
        Next
        For Each td In tr.getElementsByTagName("td")
            ws.Cells(r, c) = td.innerText
            c = c + 1
        Next
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...