确定TD标签内的类

时间:2019-04-11 15:44:54

标签: python python-3.x beautifulsoup

使用python beautifulsoup,我试图找到HTML页面的所有<tr>标签。但是,我想过滤掉<tr>标签之一中具有特定类的任何<td>标签。

我尝试使用以下代码过滤掉<td>标记内具有“警告”类的行。

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

我知道它没有过滤掉“警告类”,因为我在<tr>函数中使用了find_all,但是如果我尝试使用td,它将给我一个{{1 }}。

任何想法都值得赞赏。

TypeError: argument of type 'NoneType' is not iterable

1 个答案:

答案 0 :(得分:0)

class=不是大多数<td>元素的属性。这会导致在您的lambda中将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>