使用beautifulsoup挑选具有特定标准id的完整数据集



我是否可以从包含<tr id="tr_xxxxxx">的所有标签中过滤掉id="time_xxxxxx"id="odds_3_xxxxxx"中的所有无数据,而仅显示id="time_xxxxxx"id="odds_3_xxxxxx"中的所有有数据?

这个HTML代码中的

有一个<tr>标签,其中包含id="tr_xxxxxxx

<tr> </tr> 
标签中的

包含两组数据

<td id="odds_3_xxxxxxx"></td>
<div id="time_xxxxx"> </div> 

,但我只想得到标签,它已经完成了一组数据,只是第一组id="odds_3_xxxxxx"是ok的。

在这个html表中,数据模式如下:

  1. 第一组(数据完整集)

  2. 第二组(无时间数据)

  3. 第三组(只有时间数据)

HTML:

<tr style="display: none;" id="tr_976952" index="0" align="center" bgcolor="#F7F3F7" height="15">
   <div id="time_1039509">
       42 
     <img src="images/in.gif" border="0">
   </div>
   <td width="90" id="odds_3_1039509" title="">   
       <a class="sb" href="javascript:" onclick="ChangeDetail3(1039509,'3')">0.94</a>                            
       <img src="images/t3.gif">
   <br>
       <a class="pk" href="javascript:" onclick="ChangeDetail3(1039509,'3')">2.5/3</a>            
   <br>
       0.86
   </td> 
  <td width="90" id="odds_4_1234567" title="">   
       <a class="sb" href="javascript:" onclick="ChangeDetail3(1039509,'3')">0.12</a>                            
       <img src="images/t3.gif">
   <br>
       <a class="pk" href="javascript:" onclick="ChangeDetail3(1039509,'3')">3</a>            
   <br>
       0.41
   </td>
</tr>
<tr style="display: none;" id="tr_654654" index="0" align="center" bgcolor="#F7F3F7" height="15">
   <div id="time_654654">
     <img src="images/in.gif" border="0">
   </div>
   <td width="90" id="odds_3_654654" title="">   
       <a class="sb" href="javascript:" onclick="ChangeDetail3(654654,'3')">0.88</a>                            
       <img src="images/t3.gif">
   <br>
       <a class="pk" href="javascript:" onclick="ChangeDetail3(654654,'3')">1.5</a>            
   <br>
       0.86
   </td> 
  <td width="90" id="odds_4_1234567" title="">   
       <a class="sb" href="javascript:" onclick="ChangeDetail3(654654,'3')">0.77</a>                            
       <img src="images/t3.gif">
   <br>
       <a class="pk" href="javascript:" onclick="ChangeDetail3(654654,'3')">2</a>            
   <br>
       0.66
   </td>
</tr>
<tr style="display: none;" id="tr_534589" index="0" align="center" bgcolor="#F7F3F7" height="15">
   <div id="time_534589">
       50
     <img src="images/in.gif" border="0">
   </div>
  <td width="90" id="odds_3_534589" title=""></td> 
  <td width="90" id="odds_4_534589" title="">   
   <a class="sb" href="javascript:" onclick="ChangeDetail3(534589,'3')">0.99</a>                            
       <img src="images/t3.gif">
   <br>
       <a class="pk" href="javascript:" onclick="ChangeDetail3(534589,'3')">6</a>            
   <br>
       0.74
   </td>
</tr>

代码:(因为我的代码将显示所有数据,但我只需要完整的数据集,如果数据不在完整集中,我不想显示)

rows = table.findAll("tr", {"id" : re.compile('tr_*d')})
cols = soup.find_all(["div", "td"], id=re.compile('^(odds_3|time)_d+$'))
data = [t.strip()
        for tag in cols
        for t in tag.find_all(text=True) if t.strip()]
print '; '.join(data)
输出:

42; 0.94 ; 2.5/3 ; 0.86 
0.88 ; 1.5 ; 0.86
50
预期输出:

42; 0.94 ; 2.5/3 ; 0.86 

为什么不像这样过滤打印出来的内容呢:

if len(data) == 4:
    print '; '.join(data)

最新更新