使用BeautifulSoup解析HTML表

Ben*_*ing 5 python html-table beautifulsoup

我过去曾使用过BeautifulSoup,但我反对新事物; 令人难以置信的通用/最小的HTML表格标记...我的目标是获取每个值和它的标签(每个都在自己的td中)并打印出来......它们可以合并,我不在乎,我只是想制作确保每个标签都应用于正确的值.这是一个示例表:

<tbody><tr>
<td class="labels">Dawn:</td>
<td class="site_data" style="text-align: left;">07:01</td>
<td class="labels">Sunrise:</td>
<td class="site_data" style="text-align: left;">07:26</td>
<td class="labels">Moonrise:</td>
<td class="site_data" style="text-align: left;">14:29</td>
<td rowspan="3"><img src="images/moon.bmp" alt="Moon" width="64" align="left" border="0" height="64" style="margin: 0px 10px" /></td>
</tr>
<tr>
<td class="labels">Dusk:</td>
<td class="site_data" style="text-align: left;">18:27</td>
<td class="labels">Sunset:&nbsp;</td>
<td class="site_data" style="text-align: left;">18:02</td>
<td class="labels">Moonset:</td>
<td class="site_data" style="text-align: left;">01:55</td>
</tr>
<tr>
<td class="labels">Daylight:</td>
<td class="site_data" style="text-align: left;">11:26</td>
<td class="labels">Day length:</td>
<td class="site_data" style="text-align: left;">10:36</td>
<td class="labels">Moon Phase:</td>
<td class="site_data" style="text-align: left;">Waxing Gibbous</td>
</tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

我知道如何抓住这些价值......

for td in soup.findAll('table')[0]:  # theres more than one table on the page
    print td.renderContents().strip()
Run Code Online (Sandbox Code Playgroud)

但这只给了我......

'Dawn:'
'07:01'
'Sunrise:'
'07:26'
'Moonrise:'
'14:29'
'<img src="images/moon.bmp" alt="Moon" width="64" align="left" border="0" height="64" style="margin: 0px 10px" />'
'Dusk:'
'18:27'
'Sunset:&nbsp;'
'18:02'
'Moonset:'
'01:55'
'Daylight:'
'11:26'
'Day length:'
'10:36'
'Moon Phase:'
'Waxing Gibbous'
Run Code Online (Sandbox Code Playgroud)

我想我可以抓住那些类值"标签"和"site_data",但我如何确保标签和数据分组正确?

Joh*_*n G 2

我不是 BeautifulSoup 专家,但你可以尝试这样的事情:

for label in soup.findAll('table')[0].findAll('td', attrs={'class' : 'labels'}):
  data_sibs = label.findNextSiblings(attrs={'class' : 'site_data'})
  if len(data_sibs) > 0:
    print label.renderContents().strip() + " " + data_sibs[0].renderContents().strip()
Run Code Online (Sandbox Code Playgroud)

编辑:

测试并产生以下结果:

Dawn: 07:01
Sunrise: 07:26
Moonrise: 14:29

etc..
Run Code Online (Sandbox Code Playgroud)