Очистка веб-класса DIV в VBA

#html #excel #vba #web-scraping

#HTML #excel #vba #веб-очистка

Вопрос:

У меня возникли некоторые проблемы с программированием кода VBA для удаления данных класса div с сайта и перехода в Excel. Я не могу опубликовать URL-адрес из-за соображений конфиденциальности (данные пациента), но код размещен ниже:

 <div id="location-1" class="Location">
    <div class="grid">
      <div class="row">
          <div class="info">
            <div class="column">
              <div class="element-1">[text]</div>
              <div class="element-2">[text]</div>
              <p class="element-3"></p>
              <p class="element-4">[text]</p>
              <p class="element-5"></p>
              <p class="element-6">[text]</p>
              <div class="dir">
                    <a href="[link]" class="dir" target="_blank">Get dir</a>
                  </div> 
              </div>
          </div>
      </div>
    </div>
  </div>
 

Мой код размещен ниже. Я пытаюсь собрать информацию из «Element-1» и «Element-2» в 1 строку для каждого источника. Любая помощь здесь была бы очень признательна!

 Sub webscrape()
    Dim http As New XMLHTTP60
    Dim html As New HTMLdocument
    Dim source As Object
    
    With http
    .Open "get", "[link]", False
    .send
    html.body.innerHTML = .responseText
    End With
    
    For Each source In html.getElementsByClassName("column")
    x = x   1: Cells(x, 1) = source.getAttribute("element-1")
    Cells(x, 2) = source.getAttribute("element-2")
    Next source
    
End Sub
 

Комментарии:

1. Это не то, как вы можете получить атрибут class в vba. Попробуйте source.className вместо source.getAttribute("element-1") .

2. Я думал, что вы пытаетесь проанализировать имена классов, например, в element-1 , element-2 и т. д., И это то, о чем я ранее предлагал.

Ответ №1:

Вот два разных решения. (Не тестировался)

Первый:

 Sub webscrape()
  Dim http As New XMLHTTP60
  Dim html As New HTMLdocument
  Dim nodeColumnElements As Object
  Dim currentRow As Long
  
  currentRow = x 'Here your start row
  
  With http
    .Open "get", "[link]", False
    .send
    html.body.innerHTML = .responseText
  End With
  
  Set nodeColumnElements = html.getElementsByClassName("column")(0).getElementsByTagName("div")
  Cells(currentRow, 1) = Trim(nodeColumnElements(0).innertext)
  currentRow = currentRow   1
  Cells(currentRow, 2) = Trim(nodeColumnElements(1).innertext)
End Sub
 

Второй захватывает оба элемента напрямую:

 Sub webscrape()
  Dim http As New XMLHTTP60
  Dim html As New HTMLdocument
  Dim currentRow As Long
  
  currentRow = x 'Here your start row
  
  With http
    .Open "get", "[link]", False
    .send
    html.body.innerHTML = .responseText
  End With
  
  Cells(currentRow, 1) = Trim(html.getElementsByClassName("element-1")(0).innertext)
  currentRow = currentRow   1
  Cells(currentRow, 2) = Trim(html.getElementsByClassName("element-2")(0).innertext)
End Sub