使用BeautifulSoup解析HTML表格
我之前用过BeautifulSoup这个工具,但现在遇到了一些新情况;就是一个非常简单的HTML表格结构……我的目标是提取每个值和它的标签(每个都在自己的
<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: </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>
我知道怎么提取这些值……
for td in soup.findAll('table')[0]: # theres more than one table on the page
print td.renderContents().strip()
但这样做只给我……
'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: '
'18:02'
'Moonset:'
'01:55'
'Daylight:'
'11:26'
'Day length:'
'10:36'
'Moon Phase:'
'Waxing Gibbous'
我想我可以抓住那些类名为“labels”和“site_data”的值,但我怎么确保标签和数据正确分组呢?
2 个回答
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()
编辑:
经过测试,得到了以下结果:
Dawn: 07:01
Sunrise: 07:26
Moonrise: 14:29
etc..
2
下面的内容应该更简单,更容易理解:
import pprint
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(docTxt)
groupedData = []
for row in soup.findAll("tr"):
data = {}
allTDs = row.findAll("td")
for x in range(0, len(allTDs)-1, 2):
data[allTDs[x].renderContents().strip()] = allTDs[x+1].renderContents().strip()
groupedData.append(data)
pprint.pprint(groupedData)
输出结果:
[{'Dawn:': '07:01', 'Moonrise:': '14:29', 'Sunrise:': '07:26'},
{'Dusk:': '18:27', 'Moonset:': '01:55', 'Sunset: ': '18:02'},
{'Day length:': '10:36',
'Daylight:': '11:26',
'Moon Phase:': 'Waxing Gibbous'}]