Урок 6. Работа с XPath и продвинутыми CSS-селекторами в Selenium
В предыдущих уроках мы научились использовать базовые методы поиска элементов на странице. Однако в реальных проектах простой поиск по тегам или классам не всегда подходит. Часто элементы имеют динамические имена классов, длинные структуры или вложенные блоки. В таких случаях на помощь приходят XPath и расширенные возможности CSS-селекторов.
Что такое XPath?
XPath (XML Path Language) — это язык запросов для поиска элементов в XML и HTML-документах. С его помощью можно находить элементы на основе их структуры, атрибутов и даже текста внутри. Selenium поддерживает работу с XPath через метод:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://parsertools.ru/test")
time.sleep(10) # небольшая пауза
# Поиск по XPath
element = driver.find_element(By.XPATH, "//div[@class='do-not-print']")
print(element.get_attribute("textContent")) # Хоть текст и невидимый мы всё равно его видим
В примере выше мы нашли <div> с классом do-not-print.
Основные приёмы работы с XPath
- //tag — поиск всех элементов с указанным тегом.
- //tag[@attr=’value’] — поиск элемента по атрибуту.
- //tag[contains(@attr,’часть_значения’)] — поиск по части атрибута.
- //tag[text()=’Текст’] — поиск по точному совпадению текста.
- //tag[contains(text(),’фрагмент’)] — поиск по части текста.
# Примеры XPath
title = driver.find_element(By.XPATH, "//h1") # Первый заголовок h1
button = driver.find_element(By.XPATH, "//button[contains(text(),'Отправить')]")
link = driver.find_element(By.XPATH, "//a[@href='/contacts']")
Расширенные возможности CSS-селекторов
CSS-селекторы обычно короче, чем XPath, и Selenium отлично работает с ними. Вы уже использовали поиск по классу и атрибуту, но можно применять и более сложные варианты:
- div > span — выбор только прямого потомка.
- .menu li:first-child — выбор первого элемента в списке.
- input[type=’text’] — выбор по атрибуту.
- button[class*=’submit’] — выбор по части атрибута.
# Примеры CSS-селекторов
first_item = driver.find_element(By.CSS_SELECTOR, ".menu li:first-child")
text_field = driver.find_element(By.CSS_SELECTOR, "input[type='text']")
submit_btn = driver.find_element(By.CSS_SELECTOR, "button[class*='submit']")
Когда использовать XPath, а когда CSS?
— CSS-селекторы быстрее и лучше подходят для простых поисков (по классам, атрибутам). — XPath мощнее, так как позволяет искать по тексту и строить сложные запросы, включая навигацию по дереву DOM.
Обычно стоит начинать с CSS, а XPath использовать там, где CSS уже не справляется.
Заключение
В этом уроке мы разобрали работу с XPath и расширенными CSS-селекторами. Теперь вы умеете искать элементы на странице не только по атрибутам, но и по тексту, частичному совпадению и вложенности. Это ключевой шаг для работы с реальными сайтами, где структура бывает сложной и меняющейся.
Больше уроков по парсингу на parsertools.ru/lessons.
