vba, не могу получить дочерний элемент от html - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь вытащить дочерний элемент из какого-то html, но я не могу за всю свою жизнь решить это. Я пробовал несколько способов, все не удалось. В настоящее время код тянет все элементы, а не ребенка, который мне нужен.

Sub Title
    If doc.getElementsByClassName("lvsubtitle")(i) Is Nothing Then
        wsSheet.Cells(Sheet1.Cells(Sheet1.Rows.Count, "E").End(xlUp).Row + 1, "E").Value = "-"
    Else
        dd = doc.getElementsByClassName("lvsubtitle")(i).innerText
        Sheet1.Cells(Sheet1.Cells(Sheet1.Rows.Count, "E").End(xlUp).Row + 1, "E").Value = dd
    End If

Испытаны и неудачны, все они дают ошибки

dd = doc.getElementsByClassName("lvsubtitle")(i).child (0).innerText   
dd = doc.getElementsByClassName("lvsubtitle")(i).children (0).innerText
dd = doc.getElementsByClassName("lvsubtitle")(i, 0).innerText      
dd = doc.getElementsByClassName("lvsubtitle")(0, i).innerText 
dd = doc.getElementsByClassName("lvsubtitle")(0).innerText

Child Element

Мне нужен бит желтого цвета, но в настоящее время это также тянет в красном.

Заранее спасибо

Это URL Ссылка на Ebay

ДЛЯ ИНФОРМАЦИИ - Классы на IE имеют тенденцию показывать отличные от они делают на Chrome или Firefox:

QHarr Я никогда не могу понять, как вы делаете селектор CC. Я новичок в VBA, и я понимаю только основы c. Ваш код всегда лучшая работа, но путь из моей глубины, чтобы понять. Пожалуйста, не могли бы вы быть проще и работать на IE

1 Ответ

1 голос
/ 02 апреля 2020

Я бы предпочел селекторы css, но в соответствии с вашим запросом я бы связал метод nextSibling с базовыми узлами и сделал бы эти базовые узлы заголовками. Текущая проблема, с которой вы сталкиваетесь, заключается в том, что существует одинаковое имя класса как для нужного вам узла, так и для нежелательного. Следующее выберет только первое, но имейте в виду, что не всегда есть два для выбора. Там, где есть только один, вы получите текст, который может быть "Brand New"

Option Explicit

Public Sub OMX_data()
    Dim ie As SHDocVw.InternetExplorer

    Set ie = New SHDocVw.InternetExplorer
    With ie

        .Visible = True

        .Navigate2 "https://www.ebay.co.uk/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=phones&_sacat=0"

        Do
            DoEvents
        Loop While ie.readyState <> 4 Or ie.Busy

        Dim elems  As Object, elem As Object

        With .Document

            Set elems = .getElementsbyclassname("lvtitle")

            For Each elem In elems
                Debug.Print elem.innertext, vbTab, elem.NextSibling.NextSibling.innertext
            Next
            Stop

        End With

    End With

    .Quit
End Sub

Версия 2:

Где вам нужна только первая строка текста, если Есть два отдельных узла с одинаковым классом

Option Explicit

Public Sub OMX_data()
    Dim ie As SHDocVw.InternetExplorer

    Set ie = New SHDocVw.InternetExplorer
    With ie

        .Visible = True

        .Navigate2 "https://www.ebay.co.uk/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=phones&_sacat=0"

        Do
            DoEvents
        Loop While ie.readyState <> 4 Or ie.Busy

        Dim elems  As Object, elem As Object
        Dim currentNode As Object

        With .Document

            Set elems = .getelementsbyclassname("lvresult")

            For Each elem In elems

                Set currentNode = elem.getelementsbyclassname("lvsubtitle")

                If currentNode.Length > 1 Then
                    Debug.Print elem.getelementsbyclassname("lvtitle")(0).innertext, vbTab, currentNode(0).innertext,
                 Else
                     Debug.Print elem.getelementsbyclassname("lvtitle")(0).innertext
                 End If
                Debug.Print vbNewLine
            Next
            Stop

        End With
       .Quit
    End With
End Sub

На рисунке:

enter image description here

Многие из результирующих узлов (зеленый ограничено в изображении) может иметь несколько детей с одним и тем же классом (как показано ограниченным красным цветом). Если вы просто выберете классом lvsubtitle, вы получите все эти дочерние элементы, что означает, что вы получите текст, такой как "Brand New", когда он вам не нужен.

Теперь в моем первом примере кода я показываю, как вы можете выбрать предыдущий узел-брат (ограничен фиолетовым), перейти к DOM к смежному тегу a с помощью nextSibling и снова включить с помощью nextSibling чтобы добраться до первого div с целевым классом. Таким образом, каждый раз этот метод будет возвращать первый из двух элементов div / only 1, если только 1.

Кажется, что текст, такой как "Brand New", может появляться в первом узле, когда есть только 1. В этом случае Я показываю второй код, который вы выбираете для родительского узла (выделен зеленым); проверьте, сколько детей с целевым классом существует, и если их больше 1, возьмите только первое и напечатайте заголовок и текст первой строки, в противном случае напечатайте только заголовок.

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