【问题标题】:Determining the Class Inside a TD Tag确定 TD 标签内的类
【发布时间】:2019-09-02 07:43:41
【问题描述】:

使用 python beautifulsoup 我正在尝试查找 HTML 页面的所有 <tr> 标记。但是,我想过滤掉在 <td> 标签之一内具有特定类的任何 <tr> 标签。

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

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

我知道它没有过滤掉“警告类”,因为我在 find_all 函数中使用了 <tr>,但如果我尝试使用 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))

【问题讨论】:

    标签: python python-3.x beautifulsoup


    【解决方案1】:

    class= 不是大多数&lt;td&gt; 元素的属性。这会导致您的 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>]
    

    从那里开始,我们可以根据您的主要关注点应用此条件,即根据子元素过滤 &lt;tr&gt; 元素:

    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>
    

    【讨论】:

    • 谢谢 ggorlen。最后,如果它在任何 中找到“警告”,我希望它过滤掉完整的 。换句话说,最后我希望它更像。 Mary, 列表 2, SOTLTM, 08/12/1996,35,Tom,列表 2, SOTLTM, 09/12/1996]
    • 看看我的更新,如果它不适合你,请告诉我。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签