TLDR; Нет, в настоящее время это невозможно сделать в BeautifulSoup (потребуется модификация объектов BeautifulSoup и SoupStrainer).
Объяснение:
Проблема в том, что переданная фильтром функция вызывается методом handle_starttag()
.Как вы можете догадаться, у вас есть только значения в открывающем теге (например, имя элемента и атрибуты).
https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/init.py#L524
if (self.parse_only and len(self.tagStack) <= 1
and (self.parse_only.text
or not self.parse_only.search_tag(name, attrs))):
return None
И, как вы можете видеть, если ваша функция Strainerвозвращает False, элемент немедленно отбрасывается, без возможности принять во внимание внутренний текст (к сожалению).
С другой стороны, если вы добавите «текст» в поиск.
SoupStrainer(text="my text")
он начнет искать внутри тега текст, но у него нет контекста элемента или атрибутов - вы можете увидеть иронию: /
и объединить ее вместе просто не найдете ничего.И вы даже не можете получить доступ к родительскому элементу, как показано здесь в функции поиска: https://gist.github.com/RichardBronosky/4060082
Так что в настоящее время фильтры просто хороши для фильтрации по элементам / атрибутам.Вам нужно было бы изменить много кода Beautiful Soup, чтобы это работало.
Если вам это действительно нужно, я предлагаю наследовать объекты BeautifulSoup и SoupStrainer и изменять их поведение.