Python
Element.get_attribute в Python Selenium: как получить href, class, value и другие атрибуты
element.get_attribute() в Selenium нужен, когда вы уже нашли HTML-элемент на странице и хотите получить значение его атрибута: href, src, class, id, value, placeholder, data-* и так далее. Это не то же самое, что получить текст элемента. Текст — это то, что пользователь видит между тегами, а атрибуты лежат внутри самого HTML-тега
Например, у ссылки есть видимый текст и адрес
<a href="https://example.com/catalog" class="nav-link">Каталог</a>
Текст ссылки — Каталог, а атрибут href — https://example.com/catalog. Selenium позволяет получить оба значения, но разными способами
Короткий ответ
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get("https://example.com")
link = browser.find_element(By.TAG_NAME, "a")
print(link.text)
print(link.get_attribute("href"))
browser.quit()
link.text вернет видимый текст ссылки, а link.get_attribute("href") вернет адрес из атрибута href
Как получить href у всех ссылок
Частый сценарий — собрать все ссылки на странице
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get("https://example.com")
links = browser.find_elements(By.TAG_NAME, "a")
for link in links:
href = link.get_attribute("href")
text = link.text.strip()
if href:
print(text, "->", href)
browser.quit()
Проверка if href нужна, потому что у некоторых ссылок может не быть полноценного адреса, либо атрибут может быть пустым
Как получить value из input
Для полей формы часто нужен не текст, а атрибут value. Например, пользователь ввел значение в поле, а вы хотите проверить, что оно появилось
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get("https://example.com/form")
field = browser.find_element(By.NAME, "email")
field.send_keys("test@example.com")
value = field.get_attribute("value")
print(value)
browser.quit()
У input обычно нет видимого текста между тегами, поэтому field.text часто будет пустым. Для поля ввода почти всегда нужен value
Как получить class или data-атрибут
Метод работает не только с href и value
button = browser.find_element(By.CSS_SELECTOR, "button.buy")
print(button.get_attribute("class"))
print(button.get_attribute("data-product-id"))
print(button.get_attribute("aria-label"))
Это удобно, когда сайт хранит служебные данные в data-* атрибутах или когда нужно проверить состояние элемента по классу
Почему get_attribute возвращает None
Если get_attribute() возвращает None, это обычно значит одно из трех: атрибута нет, вы нашли не тот элемент, или страница еще не успела обновиться. Начинать лучше с проверки HTML в браузере: откройте инструменты разработчика и убедитесь, что нужный атрибут реально есть у выбранного элемента
Еще одна причина — вы ищете атрибут у родительского элемента, хотя он лежит внутри дочернего. Например, href есть у тега a, а вы нашли карточку товара div. В таком случае нужно найти ссылку внутри карточки
card = browser.find_element(By.CSS_SELECTOR, ".product-card")
link = card.find_element(By.TAG_NAME, "a")
print(link.get_attribute("href"))
Чем get_attribute отличается от text
text возвращает видимый текст элемента
button = browser.find_element(By.CSS_SELECTOR, "button")
print(button.text)
get_attribute() возвращает значение атрибута
print(button.get_attribute("type"))
print(button.get_attribute("disabled"))
Если задача звучит как «получить адрес ссылки», «получить значение input», «получить src картинки», нужен get_attribute(). Если задача звучит как «прочитать надпись на кнопке», нужен .text
Как получить src у картинки
image = browser.find_element(By.CSS_SELECTOR, "img.logo")
print(image.get_attribute("src"))
print(image.get_attribute("alt"))
src покажет путь к изображению, а alt — альтернативный текст, если он задан
Как дождаться элемента перед get_attribute
На современных сайтах элементы часто появляются не сразу. Если искать атрибут слишком рано, Selenium может не найти элемент или получить пустое значение. Для таких случаев используйте ожидания
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get("https://example.com")
wait = WebDriverWait(browser, 10)
link = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a")))
print(link.get_attribute("href"))
browser.quit()
Так код подождет до 10 секунд, пока элемент появится в DOM
Мини-практика
Создайте простую HTML-страницу page.html
<!doctype html>
<html lang="ru">
<body>
<a href="https://aglamov.biz" class="site-link">Блог</a>
<input name="city" value="Казань" placeholder="Ваш город">
<img src="logo.png" alt="Логотип">
</body>
</html>
Откройте ее через Selenium и попробуйте получить href, class, value, placeholder, src и alt. Так вы быстро почувствуете разницу между текстом элемента и атрибутами
Частые ошибки
Первая ошибка — писать get_attribute(href) без кавычек. Имя атрибута должно быть строкой
link.get_attribute("href")
Вторая ошибка — ждать результат от .text у поля input. У поля ввода берите value
field.get_attribute("value")
Третья ошибка — искать атрибут не у того элемента. Если нужен href, убедитесь, что переменная содержит именно тег a, а не внешний контейнер
Что почитать дальше по Python
Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:
- Python как считает вкладки в браузере: window_handles в Selenium
- Python открыть ссылку в новой вкладке: webbrowser и Selenium
- Python сразу закрывает браузер: как исправить в Selenium и обычном запуске
- function_name в Python: как ввести имя через input() и передать его в функцию