Тестер XPath

Тестирование XPath-выражений на HTML/XML

Вставь HTML или XML, напиши XPath-выражение и посмотри, какие узлы оно выбирает. XPath сбивает с толку чаще, чем CSS-селекторы — пропущенный / или неверная ось сложно заметна без тестирования. Работает с XPath 1.0 — именно его используют Scrapy, lxml и большинство Python-библиотек для парсинга.

HTML / XML

No input provided


Как использовать

  1. 1Вставь HTML или XMLПодойдёт любой фрагмент. XML с пространствами имён тоже поддерживается.
  2. 2Напиши выражениеВведи XPath-выражение. Например: //div[@class="price"] или //a/@href.
  3. 3Получи результатВ авторежиме совпадения обновляются сразу при вводе выражения. Если авторежим отключён — нажми Запустить.
  4. 4Используй оси для сложных запросовparent::, ancestor::, following-sibling:: — для обхода дерева в стороны и вверх, что CSS не умеет.

Примеры

Все ссылки на странице
//a/@href
Собери href всех ссылок на странице за одно выражение — без перебора элементов.
Элемент с конкретным классом
//div[@class="product-title"]
Если точное совпадение класса не работает — используй contains() для частичного совпадения.
Текст, содержащий подстроку
//p[contains(text(), "цена")]
Найди параграф по тексту содержимого — CSS так не умеет, только XPath с contains(text(), ...).
Родитель по тексту потомка
//li[.//span[@class="badge"]]/a
Выбери ссылку внутри li зная только что li содержит span.badge — обход вверх по дереву без лишних условий.
N-й элемент в группе
(//ul[@class="results"]/li)[3]
Получи ровно третий li в конкретном ul — скобки вокруг выражения обязательны для позиции.

Когда использовать

XPath незаменим в двух случаях, где CSS бессилен: когда нужно найти элемент по тексту его потомка (например, ячейку таблицы рядом с ячейкой «Цена»), и когда нужно подняться вверх по дереву DOM. В Python XPath 1.0 поддерживается нативно через lxml и Scrapy (response.xpath()). В Node.js — через xmldom и xpath. Инструмент работает именно с XPath 1.0 — той версией, которую используют эти библиотеки. Типичный рабочий процесс: получи HTML через Request Tester, открой здесь, напиши выражение и убедись что возвращает нужные узлы — потом переноси в код без сюрпризов.

Частые вопросы

В чём разница между XPath 1.0 и 2.0?
XPath 2.0 добавляет типы данных, регулярные выражения и много новых функций. Но большинство библиотек для парсинга (lxml, Scrapy, xmldom) поддерживают только XPath 1.0. Этот инструмент работает с XPath 1.0 — тем же, что в твоём скрапере.
Почему //div[@class="name"] не работает, хотя класс есть?
Проблема в точном совпадении: @class="name" требует чтобы атрибут class был ровно "name". Если у элемента несколько классов ("name active"), нужно contains(@class, "name").
Как выбрать атрибут, а не элемент?
Добавь /@attribute в конец выражения: //img/@src вернёт значения атрибута src всех изображений, а не сами теги img.
Как выбрать элемент по тексту его потомка?
Используй предикат с contains(): //td[contains(., "Цена")] вернёт сам элемент td — не текст и не потомка, а именно тег td целиком. Точка в предикате — это условие фильтрации: выбери td, у которого текстовое содержимое (включая всех потомков) содержит "Цена". Чтобы получить соседнюю ячейку той же строки — добавь /following-sibling::td[1]. CSS так не умеет — это одно из ключевых преимуществ XPath.
Как использовать XPath в Scrapy?
В Scrapy XPath вызывается через response.xpath(). Чтобы получить текст: response.xpath('//div[@class="price"]/text()').get(). Чтобы получить атрибут: response.xpath('//a/@href').getall(). Метод .get() возвращает первое совпадение, .getall() — список всех. Выражения, которые работают в этом инструменте, работают в Scrapy без изменений — оба используют XPath 1.0.

Похожие инструменты