Не думаю, что вы можете передать несколько фильтров в конструктор BeautifulSoup.Вместо этого вы можете обернуть все свои условия в один фильтр и передать его конструктору BeautifulSoup.
Для простых случаев, таких как только имена тегов, вы можете передать список в SoupStrainer
html="""
<a>yes</a>
<p>yes</p>
<span>no</span>
"""
from bs4 import BeautifulSoup
from bs4 import SoupStrainer
custom_strainer = SoupStrainer(["a","p"])
soup=BeautifulSoup(html, "lxml", parse_only=custom_strainer)
print(soup)
Выходные данные
<a>yes</a><p>yes</p>
Для указания дополнительной логики вытакже может передавать пользовательскую функцию (возможно, вам придется это сделать).
html="""
<html class="test">
<a class="wanted">yes</a>
<a class="not-wanted">no</a>
<p>yes</p>
<span>no</span>
</html>
"""
from bs4 import BeautifulSoup
from bs4 import SoupStrainer
def my_function(elem,attrs):
if elem=='a' and attrs['class']=="wanted":
return True
elif elem=='p':
return True
custom_strainer= SoupStrainer(my_function)
soup=BeautifulSoup(html, "lxml", parse_only=custom_strainer)
print(soup)
Вывод
<a class="wanted">yes</a><p>yes</p>
Как указано в документации
Парсингтолько часть документа не сэкономит вам много времени при разборе документа, но может сэкономить много памяти и значительно ускорит поиск документа.
Я думаю, вам следует проверить Улучшение производительности раздел документации.