Как я могу получить элементы в блоке?

Я не могу получить внутренний блок

На странице я получил список div.className . Но как я могу получить значение $('.className').children('.subClassName')?

const rows = await page.$$eval('.market_listing_row', items => items)
const prices = await rows.$$eval('.market_table_value.market_table_value > .normal_price', items => items.map(item => item.textContent))

Я хочу получить каждый subObject, но не могу сделать это переменными строками.

Пытался

const rows = await page.$$('.market_listing_row', items => items)
const prices = await rows.$$eval('.market_table_value.market_table_value > .normal_price', items => items.map(item => item.textContent))

Но получил ошибку

TypeError: rows.$$eval is not a function

Было бы полезно, если бы вы создали минимальный воспроизводимый пример своего кода, который не работает — почему $('.className').children('.subClassName') не работает? не очень понятно в чем у вас проблема

Pete 22.05.2019 16:19

Возможен обман. Этот ответ говорит, что используйте page.$$ вместо page.$$eval. Кроме того, если вы просто пытаетесь очистить страницу, я предлагаю вам использовать библиотеку читабельности Cheerio или Mozilla. (stackoverflow.com/questions/51280984/how-to-use-eval-functi‌​на)

Max Baldwin 22.05.2019 16:56

Возможный дубликат Как использовать функцию .$$eval

Max Baldwin 22.05.2019 16:56

На мой взгляд, это не дубликат связанного вопроса. Это больше о том, как правильно использовать page.$ вместе с elementHandle.$$eval.

Thomas Dondorf 22.05.2019 19:29
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
4
291
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В собственном javascript вы можете использовать .childNodes для доступа к прямым дочерним узлам определенного элемента. Это будет массив узлов.

К вашему сведению: https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes

Чтобы получить значение элемента, вы можете использовать .innerText для извлечения значения.

К вашему сведению: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText

не совсем уверен, почему вы проголосовали за это, но это правильный подход к использованию собственного javavscript, и он работает.

Duc Hong 22.05.2019 16:23

Он использует кукольника. Это не решение исходной проблемы.

Max Baldwin 22.05.2019 16:57
Ответ принят как подходящий

У вас есть две возможности для этого.

Вариант 1. Просто используйте один селектор

Если вам нужен селектор для .class2 внутри .class1, это просто: .class1 .class2. Таким образом, вы можете просто написать следующий код:

const prices = await page.$$eval('.market_listing_row .market_table_value.market_table_value > .normal_price', items => items.map(item => item.textContent))


Вариант 2. Используйте запрос кукловода для дескриптора элемента.

Если вам нужен дескриптор элемента по какой-либо другой причине, вы также можете выполнить запрос по другому запросу. Ваш второй пример кода уже был близок, но вы использовали функцию page.$$, которая приводит к массиву с дескрипторами элементов. Поэтому вы получаете ошибку.

const rows = await page.$$('.market_listing_row');
for (const row of rows) {
    const value = await row.$$eval('.market_table_value.market_table_value > .normal_price', items => items.map(item => item.textContent))
    console.log(value);
}

Я получил 1 блок таким образом. Но на странице от 1 до 10 пунктов.

Andrey Kadnikov 22.05.2019 20:28

@AndreyKadnikov Можно ссылку на страницу? В противном случае это будет трудно отладить;)

Thomas Dondorf 22.05.2019 20:34
steamcommunity.com/market/search? Мне нужно разобрать название товара и цену
Andrey Kadnikov 22.05.2019 21:06

@AndreyKadnikov В варианте 1 была опечатка. Вариант 1 работает для меня и должен дать вам список из 10 элементов.

Thomas Dondorf 22.05.2019 21:44

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

Andrey Kadnikov 22.05.2019 22:29

@AndreyKadnikov Изменил второй пример кода, чтобы он больше соответствовал тому, что вы хотите. Вы можете проголосовать за /принять ответ, если это вам помогло :)

Thomas Dondorf 22.05.2019 22:35

Другие вопросы по теме