Невозможно получить текст элемента nth span, используя vba - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующая часть html

<div class="description">
<span>Brand:</span> 
<a href="http://www.bestfamily.gr">Nikon</a><br/>
<span>Product Code:</span> 130342 <br/>
<span>Barcode</span> 18208948581 <br/>
<span>Availability:</span>Available</div>

Я пытаюсь получить последний диапазон и слово Доступно, используя следующее

Set availability = ie.Document.getElementsByClassName(".description").getElementsByTagName("span")(2)
wks.Cells(i, "D").Value = availability.innerText

Но он показывает все тексты диапазона Что яя здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Использование last-child псевдокласс css в комбинация потомков с родительским элементом селектор класса .

.description span:last-child

: псевдо-класс CSS last-child представляет собой последний элемент из группы родственных элементов.

Применение:

одиночное совпадение

Set availability = ie.document.querySelector(".description span:last-child")
Cells(1,1) = availability.innerText

все совпадения

Set availability = ie.document.querySelectorAll(".description span:last-child")
Cells(1,1) = availability.item(0).innerText

В противном случае вы можете вернуть коллекцию диапазонов из этого родительского класса и индексировать в нее

Set availability = ie.document.querySelectorAll(".description span")
Cells(1,1) = availability.item(2).innerText '<==choose your index here

Или даже цепочку:

Set availability = ie.document.querySelector(".description span + span + span")  '<==expand as required. This uses [adjacent sibling combinator][4].

К сожалению, псевдоклассы nth-of-type / nth-child не поддерживаются в реализации VBA, хотя вы можете использовать это во многих других языках, например, Python.

—-

Если после только Доступного вы сможете использовать .description в качестве селектора, чтобы вернуть весь текст в div.Затем используйте Split для .innerText с помощью Chr $ (32), чтобы разделить и извлечь UBound (т.е. последний элемент сгенерированного массива)

Set availability = ie.document.querySelector(".description")
Dim arr() As String
arr = split( availability.innerText, ":")
Cells(1,1) = arr(UBound(arr))
0 голосов
/ 11 декабря 2018

Как отметил Zac в комментариях, вы не должны использовать точку . с методом getElementsByClassName.

ie.Document.getElementsByClassName возвращает DispHTMLElementCollection элементов.Вам нужно указать, на какой элемент вы хотите сослаться

Установить доступность = ie.Document.getElementsByClassName (". Description") (0) .getElementsByTagName ("span") (2)

Лучший способ написать код записи - обратиться к библиотеке объектов Microsoft HTML и создать переменную для проверки каждого возвращаемого элемента.К сожалению, в реализации DispHTMLElementCollection есть ошибка, поэтому вам нужно будет использовать Object вместо DispHTMLElementCollection.

Dim doc As HTMLDocument
Dim availability As Object
Set doc = ie.Document
Set availability = doc.getElementsByClassName("description")

Dim div As HTMLDivElement
Dim span As HTMLSpanElement
Dim spans As Object

For Each div In availability
    Set spans = div.getElementsByTagName("span")
    For Each span In spans
        Debug.Print span.innerText
    Next
Next    

Output

enter image description here

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