Определение класса внутри тега TD - PullRequest
3 голосов
/ 11 апреля 2019

Использование python beautifulsoup Я пытаюсь найти все теги <tr> HTML-страницы.Однако я хотел бы отфильтровать любой тег <tr>, который имеет определенный класс внутри одного из тегов <td>.

Я попытался отфильтровать строки, которые имеют класс "Warning" в пределах <td> тег с кодом ниже.

soup = BeautifulSoup(data, 'html.parser')
print(soup.find_all('tr', class_=lambda c: 'Warning' not in c))

Я знаю, что это не отфильтровывает "класс предупреждений", потому что я использую <tr> внутри функции find_all, но если я пытаюсь использовать td, это дает мне TypeError: argument of type 'NoneType' is not iterable,

Любые мысли приветствуются.

from bs4 import BeautifulSoup

data = '''
<tr role="row" class="odd red" data-id="32">
   <td role="gridcell" class="Warning">33</td>
   <td role="gridcell">Ralph</td>
   <td role="gridcell">List 2</td>
   <td role="gridcell">FE</td>
   <td role="gridcell">07/12/1996</td>
</tr>
<tr role="row" class="even red" data-id="33">
   <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 role="row" class="odd red" data-id="34">
   <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')
print(soup.find_all('td', class_=lambda c: 'Warning' not in c))

1 Ответ

0 голосов
/ 11 апреля 2019

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...