Почему бы не создать вспомогательную функцию?
bs4
позволяет указать a function as filter
при поиске дерева с помощью find_all () .
Из документов:
Если ни одно из других совпадений не работает для вас, определите функцию, которая принимает элемент в качестве единственного аргумента. Функция должна возвращать True
, если аргумент совпадает, и False
в противном случае.
Проблема в том, что мы не можем передавать другие аргументы (список допустимых классов в этом случае). Мы можем преодолеть это, используя функцию-обертку для динамического создания фильтров.
def create_filter(tag_name, class_list):
def class_filter(tag):
return (
tag.name == tag_name and
set(tag.get('class', [])) == set(class_list)
)
return class_filter
Давайте посмотрим, как это работает на примере @AndrejKesely html.
Only alpha
print(soup.find_all(create_filter('div', ['alpha'])))
Выход
[<div class="alpha">1</div>, <div class="alpha">2</div>, <div class="alpha">3</div>, <div class="alpha">8</div>]
Только alpha
и betha
print(soup.find_all(create_filter('div', ['alpha', 'betha'])))
Выход
[<div class="alpha betha">4</div>, <div class="betha alpha">5</div>]