Определить NextSibling в ответе XMLHTTP - PullRequest
1 голос
/ 19 июня 2020

Я все еще пытаюсь узнать о NextSibling, и я использую XMLHTTP в excel VBA. Вот HTML для элемента

<ul class="list-unstyled list-specification">
                                            <li><span>ID</span> <span class="text-info">22928</span></li>
                                            
                                            <li><span>Category</span> <span class="text-info">Mechanical</span></li>
                                                <li><span>Discipline</span> <span class="text-info">Mechanical  </span></li>
                                                                                            <li><span>Commodity</span> <span class="text-info">Pipe</span></li>
                                                 <li><span>Sub commodity</span> <span class="text-info">12 In Pipe </span></li>
                                                                                            <li><span>UOM</span> <span class="text-info">EA</span></li>
                                                                                              <li><span>Available quantity</span> <span class="text-info">30</span></li>
                                                                                                                                                                                                                                                                            <li><span>Age</span> <span class="text-info">8</span></li>
                                                                                        
                                        </ul>

Я использовал эту строку, чтобы выделить первый диапазон в li (списках), чтобы определить заголовки для каждой части

Set post = html.querySelectorAll(".list-specification li span")

Затем я использовал такие циклы

    For j = 0 To post.Length - 1
        If post.Item(j).innerText = "ID" Then
            Debug.Print post.Item(j).NextSibling.innerText
        End If
    Next j

. Я получил ошибку при попытке использовать NextSibling. Я застрял в этом NextSibling .. Можете ли вы меня направить? например, идентификатор является первым в списке, и я хотел бы получить этот идентификатор на основе моего подхода

Я получил ошибку при попытке nextElementSibling

Sub Test()
    Dim html As New HTMLDocument, post As Object, i As Long
    With CreateObject("MSXML2.XMLHTTP")
        .Open "Get", "C:\Sample.html", False
        .send
        html.body.innerHTML = .responseText
    End With
    Set post = html.querySelectorAll(".list-specification li span")
    For i = 0 To post.Length - 1
        If post.Item(i).innerText = "ID" Then
            MsgBox post.Item(i).nextElementSibling.innerText: Exit For
        End If
    Next i
End Sub

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Попробуйте сделать еще NextSibling, и тогда вы обнаружите, что он работает:

Set post = Html.querySelectorAll(".list-specification li span")
For j = 0 To post.Length - 1
    If post.Item(j).innerText = "ID" Then
        MsgBox post.Item(j).NextSibling.NextSibling.innerText
        Exit For
    End If
Next j
1 голос
/ 20 июня 2020

Правильное свойство для доступа, которое я ожидал, будет nextElementSibling, но похоже, что VBA этого не реализует.

The NonDocumentTypeChildNode. nextElementSibling доступное только для чтения свойство возвращает элемент, следующий сразу за указанным в списке дочерних элементов его родительского элемента, или null, если указанный элемент является последним в списке.

Вы можете однако, более правильно, просто возьмите следующий индекс в post, т.е. post.item(1). Вы собираете заголовки и значения в одном nodeList, поэтому вы можете использовать четное и нечетное различие для отделения заголовков от значений.

Вы можете увидеть это, если запустите в консоли следующее:

post = document.querySelectorAll(".list-specification li span");
var res = ''; for (let [i] of Object.entries(post)) {res += post.item(`${i}`).innerText + ' '};console.log(res);

Spans - это встроенные контейнеры , и вы можете видеть из html, что у вас есть пробел между диапазонами, который является частью родительского li и , он становится дочерним текстовым узлом . Вот почему ваш nextSibling попадает в текстовый узел и ошибки при попытке доступа .innerText. Вам понадобится свойство текстового узла, например .nodeValue (если вы находитесь на правом узле).

enter image description here

Вы можете пройти через console и просмотрите различные свойства в действии:

enter image description here

Поскольку nextElementSibling не реализован в VBA, вам необходимо объединить nextSibling в цепочку, так как за ответ @ Sim, если вы хотите исследовать nextSibling, чтобы решить эту конкретную навигацию. Однако обратите внимание, что проверка nodeType позволит избежать выдачи ошибки, поскольку затем вы можете применить соответствующий метод доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...