JavaRush /Курсы /Python SELF /Использование CSS-селекторов для поиска элементов на веб-...

Использование CSS-селекторов для поиска элементов на веб-странице

Python SELF
31 уровень , 4 лекция
Открыта

1. Вспоминаем CSS-селекторы

Добро пожаловать в наш мир, где HTML-страницы раскрывают свои секреты не по щелчку пальца, а по меткому CSS-селектору. Если вы думаете, что CSS-селекторы нужны только для стилизации страниц (ну, чтобы ваш сайт выглядел не как исписанная школьная тетрадь), то вам пора раскрыть свой третий глаз скрейпера. Сегодня мы рассмотрим, как CSS-селекторы могут стать вашим любимым инструментом для поиска и извлечения данных.

CSS-селекторы, как уменьшительно-ласкательное выражение, позволяют нам обращаться к элементам HTML. Они помогают определить, какие элементы на странице вы хотите обработать. Если HTML-страница — это лабиринт, то CSS-селекторы — это красная нить, позволяющая найти выход.

Примеры CSS-селекторов

  • Тег: p — выбирает все <p> элементы (параграфы).
  • Класс: .classname — выбирает все элементы с заданным классом.
  • ID: #idname — выбирает элемент с определенным ID.
  • Комбинации: div > p — выбирает все <p>, которые являются непосредственными дочерними элементами <div>.

2. Использование селекторов в BeautifulSoup

Прощай, скучная жизнь без CSS-селекторов в BeautifulSoup! Пора освежить наш подход. Представим ситуацию: мы натолкнулись на сайт и просто обязаны вытащить оттуда все цитаты великих мудрецов, чтобы пустить пыль в глаза на собеседовании. Для этого мы используем метод select(), который работает именно с CSS-селекторами.

Метод select() и select_one()

Метод select() вернет вам список всех элементов, которые соответствуют вашему селектору. А select_one() найдет для вас самый первый элемент, который соответствует селектору, — как поисковик, который возвращает именно то, что нужно, а не километровый список бессмысленных ресурсов.

Допустим у вас есть HTML-страница, содержащая цитаты:

HTML

<div class="quote">
    <h2 class="author">Шелдон Купер</h2>
    <p class="text">Я не сумасшедший, моя мама меня проверяла.</p>
    <a href="https://example.com" class="link">Читать далее</a>
</div>
<div class="quote">
    <h2 class="author">Пенни</h2>
    <p class="text">О, сладкая булочка, как ты добра.</p>
    <a href="https://example.com" class="link">Читать далее</a>
</div>
<div class="quote">
    <h2 class="author">Говард Воловиц</h2>
    <p class="text">Я не просто инвестор, я космический инженер, который иногда инвестирует!</p>
    <a href="https://example.com" class="link">Читать далее</a>
</div>

Вот как мы можем их получить:

Python

from bs4 import BeautifulSoup
import requests

# Получаем HTML-код страницы
response = requests.get('http://quotes.toscrape.com/')
soup = BeautifulSoup(response.text, 'html.parser')

# Находим все цитаты с помощью CSS-селекторов
quotes = soup.select('.quote')

for quote in quotes:
    text = quote.select_one('.text').get_text()
    author = quote.select_one('.author').get_text()
    print(f'Цитата: {text}\\nАвтор: {author}\\n')

Не правда ли, удобство на грани магии? Класс .quote помогает нам забрать все элементы, обозначенные как цитаты, а .text и .author — это дочерние элементы, из которых мы извлекаем текст цитаты и автора.

3. Примеры поиска с CSS-селекторами

Попрактикуемся на примерах, чтобы ваш умный мозг знал, что делать, когда увидит div с десятью классами. Селекторы могут использоваться для более целенаправленного поиска данных на страницах. Вы можете комбинировать их, чтобы получить именно то, что вам нужно.

Селектор по классу и тегу

Python

# Поиск всех ссылок в блоке меню
menu_links = soup.select('nav.menu a')

for link in menu_links:
    print(link['href'])

Селектор по ID

Python

# Извлечение основного заголовка страницы
main_heading = soup.select_one('#main-heading')
print(main_heading.text)

Комбинирование селекторов

Python

# Поиск всех предложений в выделенной секции
highlighted_sentences = soup.select('.highlighted p')

for sentence in highlighted_sentences:
    print(sentence.text)

4. Ошибки и способы их избежать

Ваша работа как скрейпера не всегда будет простой, как чашка кофе. Бывают случаи, когда CSS-селекторы могут не сработать, если:

  • Страница имеет изменяющийся динамический контент, и нужные элементы загружаются через JavaScript.
  • Вы обращаетесь к селектору, которого не существует (например, допущена ошибка в написании класса или ID).
  • Структура HTML меняется, что ведет к воспроизведению сцены из ужастика, в которой вы ищете нужные элементы.

Чтобы избежать подобных ошибок, убедитесь, что вы работаете с актуальной и статичной версией HTML-документа, а также следите за точностью написания селекторов.

Практическое применение

Теперь у вас появилась возможность использовать CSS-селекторы в реальных проектах по извлечению данных. Этот навык пригодится при создании инструментов для анализа и мониторинга цен, получения новостей и даже отслеживания изменений на сайтах. Красота подхода в том, что даже если сайт изменит внешний вид благодаря CSS, ваш код останется функциональным, так как он зависит от HTML-структуры, а не от стилизации.

Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Long_byte Уровень 43
10 августа 2025
Что можно использовать для извлечения элементов с заданными атрибутами в BeautifulSoup?
Slevin Уровень 64
24 июля 2025
Сначала о хорошем: Четвертая задача интересная! Лайк Не смотря на то, что это по сути одна и та же лекция повторённая (уже четыре раза!(!!!)) с минимальными изменениями и дополнениями, на удивление - у меня почему-то получилось понять тему и порешать задачки за весьма смешное время, те что не EPIC вообще меньше минуты занимали. Или тема легкая, или я крут. Теперь о плохом Вот список всех клоунад только из ЭТОЙ лекции, чтобы ее автору было стыдно и возможно он задумался о смене стиля:
    Добро пожаловать в наш мир, где HTML-страницы раскрывают свои секреты не по щелчку пальца,
    (ну, чтобы ваш сайт выглядел не как исписанная школьная тетрадь), то вам пора раскрыть свой третий глаз скрейпера.
    CSS-селекторы, как уменьшительно-ласкательное выражение, позволяют нам обращаться к элементам HTML.
    Если HTML-страница — это лабиринт, то CSS-селекторы — это красная нить, позволяющая найти выход.
    Прощай, скучная жизнь без CSS-селекторов в BeautifulSoup!
    Представим ситуацию: мы натолкнулись на сайт и просто обязаны вытащить оттуда все цитаты великих мудрецов, чтобы пустить пыль в глаза на собеседовании.
    как поисковик, который возвращает именно то, что нужно, а не километровый список бессмысленных ресурсов.
    Не правда ли, удобство на грани магии?
    чтобы ваш умный мозг знал, что делать, когда увидит div с десятью классами.
    <Ваша работа как скрейпера не всегда будет простой, как чашка кофе./em>
Удаление всего этого мусора, абсолютно никак не уменьшит объем знаний из лекции, но значительно облегчит ее читаемость и восприятие.
Alexey Kim Уровень 41
8 октября 2025
Вот мнение ИИ об этом: Общее впечатление: Это прекрасный, живой и образный текст который: Делает техническую тему доступной и интересной Использует яркие метафоры Сохраняет юмор и самоиронию Мотивирует изучать инструмент дальше Отличный материал для обучения или технической статьи! 👏 Похоже, ИИ и писал лекцию.
Slevin Уровень 64
8 октября 2025
А так и есть, уже в дальнейших лекциях и других курсах начали встречаться упоминания несуществующих (и не существовавших) функций, прыжки стиля оформления в рамках одной лекции и так далее. Лекции написаны ИИ, и если повезет - их немного вычитывали (редко). Но тем не менее, как человек который освоих азы Пайтона, Постгре и сейчас осваивает Линух с Докером... Это нормально, учиться можно. Все равно больше учиться придется на практике, больше лезть в другие источники информации - это нормальная работа программера, как я ее, на данный момент, себе представляю