Вы можете создать пользовательскую функцию запроса для передачи в find()
:
def has_my_text(tag):
found = tag.select_one('.Bgbcca')
# important to assign the result to avoid calling
# .get_text() on a NoneType, resulting in an error.
if found:
return found.get_text() == "MyText"
soup = bs4.... # assign your soup object
found = soup.find(has_my_text)
# <div class="Bgbcca">MyText</div>
# <span class="hthtb">
# <div>
# <span class="hthtb">Text3</span>
# </div>
# </span>
# </div>
# Note your span class is nested so we go two level in
result = found.select_one('.hthtb').select_one('.hthtb').get_text()
# 'Text3'
# This below also works if your other span are always empty texts
result = found.select_one('.hthtb').get_text().strip()
Обратите внимание, find()
и select_one
предполагают, что нам нужно только первое найденное совпадение. Если вам нужно обрабатывать несколько совпадений, вам нужно использовать find_all()
и select()
и соответственно вносить изменения в код.
Если вы хотите обрабатывать переменные тексты, вы можете определить свою функцию следующим образом:
def has_my_text(tag, text):
found = tag.select_one('.Bgbcca')
if found:
return found.get_text() == text
И оберните функцию в find()
так:
txt = "MyText"
soup.find(lambda tag: has_my_text(tag, txt))