Я бы предпочел селекторы 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
На рисунке:
Многие из результирующих узлов (зеленый ограничено в изображении) может иметь несколько детей с одним и тем же классом (как показано ограниченным красным цветом). Если вы просто выберете классом lvsubtitle
, вы получите все эти дочерние элементы, что означает, что вы получите текст, такой как "Brand New"
, когда он вам не нужен.
Теперь в моем первом примере кода я показываю, как вы можете выбрать предыдущий узел-брат (ограничен фиолетовым), перейти к DOM к смежному тегу a
с помощью nextSibling
и снова включить с помощью nextSibling
чтобы добраться до первого div
с целевым классом. Таким образом, каждый раз этот метод будет возвращать первый из двух элементов div / only 1, если только 1.
Кажется, что текст, такой как "Brand New"
, может появляться в первом узле, когда есть только 1. В этом случае Я показываю второй код, который вы выбираете для родительского узла (выделен зеленым); проверьте, сколько детей с целевым классом существует, и если их больше 1, возьмите только первое и напечатайте заголовок и текст первой строки, в противном случае напечатайте только заголовок.