class=
не является атрибутом большинства ваших <td>
элементов. Это заставляет c
быть установленным на None
в вашей лямбде, поэтому вы можете автоматически пропустить их через фильтр с помощью условного теста:
print(soup.find_all('td', class_=lambda c: not c or 'Warning' not in c))
# ^^^^^^^^
выход
[<td role="gridcell">Ralph</td>,
<td role="gridcell">List 2</td>,
<td role="gridcell">FE</td>,
<td role="gridcell">07/12/1996</td>,
<td role="gridcell">34</td>,
<td role="gridcell">Mary</td>,
<td role="gridcell">List 2</td>,
<td role="gridcell">SOTLTM</td>,
<td role="gridcell">08/12/1996</td>,
<td role="gridcell">35</td>,
<td role="gridcell">Tom</td>,
<td role="gridcell">List 2</td>,
<td role="gridcell">SOTLTM</td>,
<td role="gridcell">09/12/1996</td>]
Перейдя оттуда, мы можем применить это условие к вашей основной задаче, которая заключается в фильтрации элементов <tr>
по их дочерним элементам:
soup = BeautifulSoup(data, 'html.parser')
for tr in soup.find_all('tr'):
if not bool(tr.find_all('td', class_=lambda c: c and 'Warning' in c)):
print(tr) # or print(tr.find_all('td')) if you'd like to
# access only the children of the filtered <tr>s
выход
<tr class="even red" data-id="33" role="row">
<td role="gridcell">34</td>
<td role="gridcell">Mary</td>
<td role="gridcell">List 2</td>
<td role="gridcell">SOTLTM</td>
<td role="gridcell">08/12/1996</td>
</tr>
<tr class="odd red" data-id="34" role="row">
<td role="gridcell">35</td>
<td role="gridcell">Tom</td>
<td role="gridcell">List 2</td>
<td role="gridcell">SOTLTM</td>
<td role="gridcell">09/12/1996</td>
</tr>