#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