BeautifulSoup刮平嵌套表

时间:2015-05-05 21:38:19

标签: python beautifulsoup html-parsing

我一直试图从使用大量表格的网站中删除数据。我一直在研究beautifulsoup文档以及stackoverflow,但我仍然迷失了。

这是上表:



      <form action="/rr/" class="form">
        <table border="0" width="100%" cellpadding="2" cellspacing="0" align="left">
          <tr bgcolor="#6699CC">
            <td valign="top"><font face="arial"><b>Uesless Data</b></font></td>
    
            <td width="10%"><br /></td>
    
            <td align="right"><font face="arial">Uesless Data</font></td>
          </tr>
    
          <tr bgcolor="#DCDCDC">
            <td> <input size="12" name="s" value="data:" onfocus=
            "this.value = '';" /> <input type="hidden" name="d" value="research" />
    				
            <input type="submit" value="Date" /></td>
    
            <td width="10%"><br /></td>
    
          </tr>
        </table>
      </form>
    
      <table border="0" width="100%">
        <tr>
          <td></td>
        </tr>
      </table><br />
      <br />
    
      <table border="0" width="100%">
        <tr>
          <td valign="top" width="99%">
            <table cellpadding="2" cellspacing="0" border="0" width="100%">
              <tr bgcolor="#A0B8C8">
                <td colspan="6"><b>Data to be pulled</b></td>
              </tr>
    
              <tr bgcolor="#DCDCDC">
                <td><font face="arial"><b>Data to be pulled</b></font></td>
    
                <td><font face="arial"><b>Data to be pulled</b></font></td>
    
                <td align="center"><font face="arial"><b>Data to be pulled
                </b></font></td>
    
                <td align="center"><font face="arial"><b>Data to be pulled
                </b></font></td>
    
                <td align="center"><font face="arial"><b>Data to be pulled
                </b></font></td>
    
                <td align="center"><font face="arial"><b>Data to be pulled
                </b></font></td>
              </tr>
    
              <tr>
                <td>Data to be pulled</td>
    
                <td align="center">Data to be pulled</td>
    
                <td align="center">Data to be pulled</td>
    
                <td align="center">Data to be pulled</td>
    
                <td align="center"><br /></td>
              </tr>
    	    </table>
    	  </td>
    	</tr>
      </table>
&#13;
&#13;
&#13;

有很多桌子,其中没有一张真正有任何区别的标识或标签。我最近的尝试是:

table = soup.find('table', attrs={'border':'0', 'width': "100%'})

哪个只拉第一个空表。我觉得答案很简单,我在想它。

1 个答案:

答案 0 :(得分:4)

如果您只是寻找所有表格,而不是第一张表格,那么您只需要find_all而不是find

如果您正在尝试查找特定的表格,例如嵌套在另一个表格中的表格,并且页面使用的是90年代风格的设计,则无法通过id或其他attrs找到它,唯一的选择是按结构搜索:

for table in soup.find_all('table'):
    for subtable in table.find_all('table'):
        # Found it!

当然,如果你真的想要,你可以将它变成一个单一的理解:

subtable = next(subtable for table in soup.find_all('table') 
                for subtable in table.find_all('table'))

请注意,我已离开attrs。如果页面上的每个表都有相同attrs的超集,那么通过指定它们就无助于任何事情。

这一切显然都是丑陋而脆弱的......但是这种布局并没有让这些 变得脆弱。

使用不同的库,例如lxml.html,可以让你通过XPath进行搜索可能会使它更紧凑,但它最终会做同样的事情。