Одна из распространенных задач в процессе парсинга интернет-страниц – поиск элементов по их классу. Если у элемента несколько классов, необходимо обеспечить правильную обработку таких ситуаций.
<!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'])