BeautifulSoup 抓取嵌套表格

BeautifulSoup scraping nested tables

我一直在尝试从一个使用了大量 table 的网站上抓取数据。我一直在研究 beautifulsoup 文档以及此处关于 Whosebug 的内容,但仍然迷路了。

这里说的是table:

      <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>

有相当多的 table,其中 none 确实具有任何可区分的 ID 或标签。我最近的尝试是:

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

里面只拉第一个空table。感觉答案很简单,想多了

如果您只想查找所有 table,而不是第一个,您只需要 find_all 而不是 find

如果您要查找特定的 table,例如嵌套在另一个页面中的页面,并且该页面使用的是 90 年代风格的设计,因此无法通过 [=14= 找到它] 或其他属性,唯一的选择是按结构搜索:

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。如果页面上的每个 table 都有相同属性的超集,那么指定它们将无济于事。

这整个事情显然是丑陋和脆弱的......但真的没有办法用这种布局变得脆弱。

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