Тестер CSS-селекторов
Проверяй CSS-селекторы на своём HTML онлайн — сколько элементов нашлось и какие именно
Селектор ничего не находит или находит сорок элементов вместо двенадцати, а в DevTools страница выглядит ровно так, как надо. Вставь тот HTML, который реально получает твой парсер, проверь на нём селекторы и посмотри все совпадения и их число до того, как запускать обход тысячи страниц.
Нет входных данных
Как использовать
- 1Вставь HTML, который получает код, а не то, что показывает DevTools — Это два разных документа. Возьми тело ответа из Отправки запросов, или исходный код страницы, или Copy outerHTML, если точно знаешь, что фрагмент есть в исходнике. Проверка не на том документе — самая частая причина, по которой селектор проходит здесь и падает в бою.
- 2Напиши селектор — Работает всё, что понимает браузер: .product-card h2 a, div[data-id], ul.results > li:nth-child(2), nav a[href]:not([href='#']).
- 3Сначала смотри на число, потом на совпадения — Количество совпадений говорит больше, чем сами совпадения. Ждал двенадцать товаров, получил сорок — селектор выходит за пределы списка. Получил ноль — либо класса нет в сыром HTML вовсе, либо он написан иначе на один символ.
- 4Сужай, пока число не сойдётся — Добавь родителя, атрибут или структурный псевдокласс и следи, как меняется число. Совпадения пересчитываются по мере ввода; на большом HTML выключи автообработку и жми «Запустить».
Примеры
.product-title -> 0 совпаденийdiv.price#root > div:nth-child(2) > div > div.sc-hKgILt > ul > li:nth-child(1) > a[class^="ProductCard_"]ul.results > li.itemsection.reviews .authornav a[href]:not([href='#'])tbody tr:nth-child(2n) td:nth-child(3)Когда использовать
На CSS-селекторах работает большинство парсеров на Python и Node — BeautifulSoup, Scrapy, Cheerio и Playwright принимают их напрямую. Загвоздка в том, что селектор, проверенный в DevTools, проверен не на том документе. DevTools показывает DOM после выполнения скриптов, а парсер видит пришедшие байты. Всего, что вставил скрипт, там нет, и селектор, поймавший в консоли сорок элементов, в коде поймает ноль. Вторая постоянная проблема — имена классов, на которые нельзя опереться. Styled-components, CSS-модули и утилитарные фреймворки генерируют имена вида sc-hKgILt или ProductCard_title__x7Kd2, и те меняются при каждой пересборке сайта. Парсер, привязанный к ним, живёт неделю. Цепляйся за то, что не относится к оформлению: data-атрибут, id, itemprop, структуру тегов — или хотя бы за устойчивый префикс через [class^="ProductCard_"]. Инструмент работает с HTML как со строкой, ровно так же, как твой парсер. Он возвращает каждый найденный элемент и, что полезнее, их количество. Число и есть настоящая проверка: сорок штук вместо двенадцати означают, что селектор дотянулся дальше контейнера, а ноль — что искомого в этом HTML нет вовсе. Оба ответа приходят за секунды, а не после обхода. Чего инструмент не делает: он не выполняет JavaScript, а динамические псевдоклассы вроде :hover, :focus и :checked в статичном документе не значат ничего — структурные же (:nth-child, :first-of-type, :not()) работают полностью. Ещё CSS не умеет выбирать элемент по тексту и подниматься к родителю; когда нужно это, бери Тестер XPath. А чтобы получить сам сырой HTML, отправь запрос через Отправку запросов и вставь тело ответа сюда.