Я не могу получить внутренний блок
На странице я получил список 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
Возможен обман. Этот ответ говорит, что используйте page.$$
вместо page.$$eval
. Кроме того, если вы просто пытаетесь очистить страницу, я предлагаю вам использовать библиотеку читабельности Cheerio или Mozilla. (stackoverflow.com/questions/51280984/how-to-use-eval-functiна)
Возможный дубликат Как использовать функцию .$$eval
На мой взгляд, это не дубликат связанного вопроса. Это больше о том, как правильно использовать page.$
вместе с elementHandle.$$eval
.
В собственном 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, и он работает.
Он использует кукольника. Это не решение исходной проблемы.
У вас есть две возможности для этого.
Вариант 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 пунктов.
@AndreyKadnikov Можно ссылку на страницу? В противном случае это будет трудно отладить;)
@AndreyKadnikov В варианте 1 была опечатка. Вариант 1 работает для меня и должен дать вам список из 10 элементов.
Да, и для именования я могу использовать это. Но удобнее получить список блоков и работать с каждым из них. Могу ли я это сделать?
@AndreyKadnikov Изменил второй пример кода, чтобы он больше соответствовал тому, что вы хотите. Вы можете проголосовать за /принять ответ, если это вам помогло :)
Было бы полезно, если бы вы создали минимальный воспроизводимый пример своего кода, который не работает — почему
$('.className').children('.subClassName')
не работает? не очень понятно в чем у вас проблема