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 进行搜索,这可能会使它更紧凑一些,但它最终会做同样的事情。
我一直在尝试从一个使用了大量 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 进行搜索,这可能会使它更紧凑一些,但它最终会做同样的事情。