Вы можете использовать пользовательскую функцию , чтобы проверить, присутствует ли в тексте слово .
html = '''
<td>the keyword is present in the text</td>
<td>the keyword</td>
<td></td>
<td>the word is not present in the text</td>'''
soup = BeautifulSoup(html, 'lxml')
the_word = 'keyword'
tags = soup.find_all('td', text=lambda t: t and the_word in t)
print(tags)
# [<td>the keyword is present in the text</td>, <td>the keyword</td>]
Обычно будет работать только the_word in t
.Но если есть какие-либо теги <td>
, у которых нет текста, как показано в примере (<td></td>
), использование the_word in t
вызовет TypeError: argument of type 'NoneType' is not iterable
.Вот почему мы сначала должны проверить, не является ли текст None
.Следовательно, функция lambda t: t and the_word in t
.
Если вам не удобны lambda
s, вы можете использовать простую функцию, эквивалентную приведенной выше:
def contains_word(t):
return t and 'keyword' in t
tags = soup.find_all('td', text=contains_word)