Я пытаюсь получить по одному уникальному номеру с каждой из набора похожих веб-страниц. Все они очень похожи, но текущий код, который я использую, использует MSXML2.XMLHTTP и идентифицирует текст в данном классе или теге.
Проблема в том, что эти веб-страницы незначительно различаются, поэтому код не может надежно извлекать из них все на основе критериев элемента. И на странице много одинаковых классов и тегов, поэтому нет ничего уникального, что можно было бы идентифицировать.
Однако есть уникальный фрагмент текста («Код ISIN:»), а затем в следующей строке следует номер ISIN, который я хочу. Я слышал о синтаксическом анализе по идентификаторам, но не могу их найти / не знаю, как работает этот подход.
Часть информации, которую я хочу извлечь, - это "GB00B6Y7NF43":
<tr>
<th class="align-left">ISIN code:</th>
<td> GB00B6Y7NF43 </td>
</tr>
Это большая часть кода, который я использую прямо сейчас, чтобы найти другую информацию на странице, используя подход Item (...). Я не знаю, прав ли мой код сам по себе, но пока он правильно извлекает информацию, если вы укажете Item (0) или Item (1) и т. Д.
Dim request As Object
Dim response As String
Dim html As New HTMLDocument
Dim td As Object
Dim website As String
Dim charge As Variant
With Worksheets("Sheet1")
website = Range("A14").Value
End With
Set request = CreateObject("MSXML2.XMLHTTP")
request.Open "GET", website, False
request.send
response = StrConv(request.responseBody, vbUnicode)
html.body.innerHTML = response
Worksheets("Information").Activate
r = r + 2:
Cells(r, 3) = html.getElementsByClassName("header-row").Item(0).innerText
Cells(r, 5) = html.getElementsByTagName("td").Item(0).innerText
Cells(r, 4) = html.getElementsByClassName("icon-link pdf-icon").Item(1).href
Есть ли другой подход / стиль кодирования / настройка моего кода для этого?
Я мог бы использовать dim ie / appIe и аналогичные методы, но пока они были сложнее и медленнее на компьютере, чем просто работа с текстом html.
1 ответ
Это последний дочерний элемент в таблице, поэтому вы можете связывать вызовы lastchild
html.querySelector("[summary='More fund information']").children(0).lastchild.lastchild.innertext
Так
Option Explicit
Public Sub test()
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.hl.co.uk/funds/fund-discounts,-prices--and--factsheets/search-results/f/fidelity-asia-class-w-accumulation/key-features", False
.send
html.body.innerHTML = .responseText
End With
Debug.Print html.querySelector("[summary='More fund information'] ").Children(0).LastChild.LastChild.innerText
End Sub
Более медленным, но, возможно, более надежным с течением времени методом может быть сбор заголовков таблиц и поиск заголовка с желаемым текстом ISIN, а затем использование узла NextSibling
(td).
Option Explicit
Public Sub test()
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.hl.co.uk/funds/fund-discounts,-prices--and--factsheets/search-results/f/fidelity-asia-class-w-accumulation/key-features", False
.send
html.body.innerHTML = .responseText
End With
Dim i As Long, nodes As Object
Set nodes = html.querySelectorAll("[summary='More fund information'] th")
For i = 0 To nodes.Length - 1
If nodes.Item(i).innerText = "ISIN code:" Then
Debug.Print nodes.Item(i).NextSibling.innerText
Exit For
End If
Next
End Sub
Похожие вопросы
Новые вопросы
html
HTML (язык гипертекстовой разметки) — это язык разметки для создания веб-страниц и другой информации, отображаемой в веб-браузере. Вопросы относительно HTML должны включать минимальный воспроизводимый пример и некоторое представление о том, чего вы пытаетесь достичь. Этот тег редко используется отдельно и часто в паре с [CSS] и [JavaScript].