Обработка двойных классов с помощью BeautifulSoup



Одна из распространенных задач в процессе парсинга интернет-страниц – поиск элементов по их классу. Если у элемента несколько классов, необходимо обеспечить правильную обработку таких ситуаций.

<!DOCTYPE html>
<html lang="ru">
<head>
    <title>Тестовая страница</title>
</head>
<body>
    <div class="class1 class2">Элемент 1</div>
    <div class="class1 class3">Элемент 2</div>
    <div class="class2 class3">Элемент 3</div>
</body>
</html>

Особенности извлечения элементов с двойными классами. Загрузим исходный HTML-документ:

from bs4 import BeautifulSoup

html = """
<!DOCTYPE html>
<html lang="ru">
<head>
    <title>Тестовая страница</title>
</head>
<body>
    <div class="class1 class2">Элемент 1</div>
    <div class="class1 class3">Элемент 2</div>
    <div class="class2 class3">Элемент 3</div>
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')

Для поиска элементов, которые имеют двойные классы, можно применить следующую конструкцию:

elements = soup.find_all('div', class_='class1 class2')

В нашем случае буде найден только один элемент:

[<div class="class1 class2">Элемент 1</div>]

Стоит помнить, что порядок следования классов учитывается, элементы, в которых используется другой порядок, найдены не будут.

Если нужно найти элементы без учета порядка следования классов, лучше использовать CSS-селекторы:

elements = soup.select('div.class2.class1')

Если требуется найти элементы, которые содержат хотя бы один из указанных классов:

elements = soup.find_all('div', class_=['class1', 'class2'])


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: