Вы можете использовать селекторы класса в цикле. Узор
.previousclosingpriceonetradingdayago .value__b93f12ea
указывает на получение дочерних элементов с классом value__b93f12ea
, имеющих родителей с классом previousclosingpriceonetradingdayago
. "." впереди находится селектор класса css , и это более быстрый способ выбора, поскольку современные браузеры оптимизированы для css. Пространство между двумя классами - это комбинатор-потомок . querySelector возвращает первое совпадение для этого шаблона из html-документа веб-страницы.
Это соответствует на странице:
![image](https://i.stack.imgur.com/xZHFn.png)
Здесь вы можете снова увидеть родительские и дочерние отношения и классы:
<section class="dataBox previousclosingpriceonetradingdayago numeric">
<header class="title__49417cb9"><span>Prev Close</span></header>
<div class="value__b93f12ea">0.8732</div>
</section>
N.B. Если вы являетесь клиентом Bloomberg, изучите его API . Кроме того, весьма вероятно, что вы можете получить эту же информацию из других выделенных API-интерфейсов, которые позволят выполнять намного более быстрые и надежные запросы xhr.
VBA (Internet Explorer):
Option Explicit
Public Sub test()
Dim pairs(), ws As Worksheet, i As Long, ie As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set ie = CreateObject("InternetExplorer.Application")
With ws
pairs = Application.Transpose(.Range("G2:G" & .Cells(.rows.Count, "G").End(xlUp).Row).Value) ' assumes pairs start in row 2
End With
Dim results()
ReDim results(1 To UBound(pairs))
With ie
.Visible = True
For i = LBound(pairs) To UBound(pairs)
.Navigate2 "https://www.bloomberg.com/quote/" & pairs(i) & ":CUR", False
While .Busy Or .readyState < 4: DoEvents: Wend
results(i) = .document.querySelector(".previousclosingpriceonetradingdayago .value__b93f12ea").innerText
Next
.Quit
End With
ws.Cells(2, "I").Resize(UBound(results), 1) = Application.Transpose(results)
End Sub
Для очень ограниченного числа запросов (что приводит к блокировке) вы можете использовать запрос xhr и вывести значение заново. Я предполагаю, что пары находятся на листе один и начинаются с G2. Я также предполагаю, что в столбце G нет пустых ячеек или недопустимых пар, включая последнюю пару для поиска. В противном случае вам нужно будет разработать код для этого.
Попробуйте регулярное выражение здесь
Option Explicit
Public Sub test()
Dim re As Object, pairs(), ws As Worksheet, i As Long, s As String
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set re = CreateObject("VBScript.RegExp")
With ws
pairs = Application.Transpose(.Range("G2:G" & .Cells(.rows.Count, "G").End(xlUp).Row).Value) ' assumes pairs start in row 2
End With
Dim results()
ReDim results(1 To UBound(pairs))
With CreateObject("MSXML2.XMLHTTP")
For i = LBound(pairs) To UBound(pairs)
.Open "GET", "https://www.bloomberg.com/quote/" & pairs(i) & ":CUR", False
.send
s = .responseText
results(i) = GetCloseValue(re, s, "previousClosingPriceOneTradingDayAgo%22%3A(.*?)%2")
Next
End With
ws.Cells(2, "I").Resize(UBound(results), 1) = Application.Transpose(results)
End Sub
Public Function GetCloseValue(ByVal re As Object, inputString As String, ByVal pattern As String) As String 'https://regex101.com/r/OAyq30/1
With re
.Global = True
.MultiLine = True
.IgnoreCase = False
.pattern = pattern
If .test(inputString) Then
GetCloseValue = .Execute(inputString)(0).SubMatches(0)
Else
GetCloseValue = "Not found"
End If
End With
End Function
![enter image description here](https://i.stack.imgur.com/KP1MD.png)