使用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
答案 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>