Я пытаюсь получить по одному уникальному номеру с каждой из набора похожих веб-страниц. Все они очень похожи, но текущий код, который я использую, использует 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
user15881 29 Окт 2019 в 14:51
Можете ли вы поделиться URL-адресом веб-сайта? Общий подход состоял бы в том, чтобы найти элемент таблицы, а затем, вероятно, просто перебрать каждый элемент там, просматривая InnerText. Затем выберите следующий элемент, когда найдете совпадение. Может быть более совершенный метод, в зависимости от источника страницы.
 – 
Ryan Wildry
29 Окт 2019 в 15:56
Пожалуйста, укажите URL, если это возможно, чтобы мы могли проверить.
 – 
QHarr
29 Окт 2019 в 16:45
 – 
user15881
29 Окт 2019 в 16:58

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
0
QHarr 30 Окт 2019 в 01:09
Это сработало, как приятель мечты. Спасибо вам за помощь. Хороший способ подумать об этом
 – 
user15881
30 Окт 2019 в 17:59