kay*_*duh 5 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>Run Code Online (Sandbox Code Playgroud)
有很多表,但实际上没有一个表具有任何区别的ID或标签。我最近的尝试是:
table = soup.find('table', attrs={'border':'0', 'width': "100%'})
Run Code Online (Sandbox Code Playgroud)
这只拉第一个空表。我觉得答案很简单,我想得太多了。
如果您只是查找所有表,而不是第一个表,那么您只需要find_all而不是find.
如果您试图查找某个特定的表,例如嵌套在另一个表中的表,并且该页面使用 90 年代风格的设计,因此无法通过id或其他属性找到它,唯一的选择是按结构搜索:
for table in soup.find_all('table'):\n for subtable in table.find_all('table'):\n # Found it!\nRun Code Online (Sandbox Code Playgroud)\n\n当然,如果你真的想的话,你可以将其扁平化为一个单一的理解:
\n\nsubtable = next(subtable for table in soup.find_all('table') \n for subtable in table.find_all('table'))\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,我省略了attrs. 如果页面上的每个表都有相同属性的超集,那么指定它们不会有任何帮助。
这整件事显然是丑陋和脆弱\xe2\x80\xa6 但真的没有办法不这种布局
\n\n使用不同的库(例如lxml.html,允许您通过 XPath 进行搜索)可能会使其更加紧凑,但最终会做同样的事情。
| 归档时间: |
|
| 查看次数: |
3929 次 |
| 最近记录: |