Использование getElementsByClassName с несколькими элементами

#vba #import-from-excel #getelementsbyclassname

#vba #импорт из excel #getelementsbyclassname

Вопрос:

Я пытаюсь получить цену с веб-сайта, используя макросы VBA. В целом следующий код работает нормально (пример):

 price = html.getElementsByClassName("fpStriked fpStrikedBefore jsStriked").Item(0).innerText
  

Однако, когда HTML имеет более одного атрибута в классе, содержащем цену, предыдущий код не может извлечь информацию.
Вот пример класса, содержащего несколько атрибутов

 "span class="fpPrice price jsMainPrice jsProductPrice hideFromPro" itemprop="price" content="33.99" 33<sup>€99</sup>"
  

цена = html.getElementsByClassName(«fpPrice price jsMainPrice jsProductPrice hideFromPro»).Элемент(0).Внутренний текст

Как я могу адаптировать код, чтобы получить цену (33,99) в этом случае?

Ответ №1:

В приведенном выше коде getElementsByClassName выбрал бы все элементы со всеми 3 классами («fpStriked fpStrikedBefore jsStriked»), но в вашем span нет ни одного из этих классов для выбора.

Комментарии:

1. Первый был всего лишь примером того, что работало у меня на других веб-сайтах. Если я применю ту же логику во втором случае, это не сработает price = html.getElementsByClassName(«fpPrice price jsMainPrice jsProductPrice hideFromPro»). Элемент(0).Внутренний текст

Ответ №2:

Вы можете выбрать все элементы с классами с помощью querySelectorAll (проверьте примеры), например document.querySelectorAll(".fpStriked, .fpStrikedBefore, .jsStriked")

С getElementsByClassName — вы не можете

UPD: Как получить содержимое из querySelectorAll

querySelectorAll возвращает HTML-коллекцию, которую вы можете использовать .forEach для получения содержимого для каждого элемента

 let allItems = document.querySelectorAll(".jsProductPrice, .fpStriked, .fpStrikedBefore, .jsStriked")

allItems.forEach(e=>{
  console.log(e.textContent)
})  
 <span class="fpPrice price jsMainPrice jsProductPrice hideFromPro" itemprop="price" content="33.99"> 33<sup>€99</sup></span>
<span class="fpPrice price jsMainPrice jsProductPrice hideFromPro" itemprop="price" content="35"> 35<sup>€00</sup></span>  

Комментарии:

1. Спасибо. На самом деле первый код работает хорошо. Однако, когда я хочу получить цену из HTML-кода, приведенного ниже в моем вопросе, с помощью price = html.getElementsByClassName(«fpPrice price jsMainPrice jsProductPrice hideFromPro»). Элемент(0).Внутренний текст не работает. При использовании document. querySelectorAll Я получаю сообщение об ошибке «Требуется объект»

2. @DavidMorales проверяет обновление, querySelectorAll возвращает HTML-коллекцию