На одной странице есть два div:
<div class='class1'>...</div>
<div class='class1 class2'>...</div>
Используйте код ниже:
let result = await page.$$eval('div.class1', nodes => {...})
получить два вида div выше, но я просто хочу получить divs(class='class1') .
Как я могу это сделать?
Я хочу, чтобы все элементы class = "class1" && class != 'class2', и это решено ниже, спасибо @Vaviloff
Согласно документы, page.$$eval
использует document.querySelectorAll
для поиска элементов с переданным селектором, поэтому мы можем сказать нет, чтобы получить класс 2:
let result = await page.$$eval('div.class1:not(.class2)', nodes => {...})
Но, очевидно, это плохо масштабируется: вам нужно отслеживать все классы разное, которые не должны выбираться, и постоянно обновлять код.
Лучше фильтровать только те узлы, у которых есть именно нужное имя класса:
let result = await page.$$eval('.class1', nodes =>
nodes.filter(node => node.className === "class1").map(node => node.textContent)
);
Обратите внимание, что здесь нам не нужно преобразовывать nodeList в массив (например, с помощью [...nodes]
или Array.from(nodes)
), и мы можем сразу использовать фильтр и сопоставление. Это потому, что page.$$eval
удобно делает это за нас.
Спасибо за ваш ответ, он работает, и я получаю больше знаний от вашего ответа!
вы хотите только первый элемент? или любой элемент с
class = "class1"