2010-11-15 78 views
5

J'ai utilisé BeautifulSoup par le passé, mais je suis confronté à quelque chose de nouveau; Incroyablement générique/minimal de tableau HTML ... Mon but est de saisir chaque valeur et c'est étiquette (chacun dans son propre td) et les imprimer ... Ils peuvent être fusionnés, je m'en fous, je veux juste faire Assurez-vous que chaque étiquette est appliquée à la bonne valeur. Voici un exemple de table:Analyse de tables HTML avec BeautifulSoup

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

Je sais comment saisir ces valeurs ...

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

mais cela ne me donne ....

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

Je suppose que je pouvais saisissez ces valeurs de classe "labels" et "site_data" mais comment puis-je m'assurer que les étiquettes et les données sont correctement regroupées?

Répondre

2

Je ne suis pas un expert BeautifulSoup, mais vous pouvez essayer quelque chose comme ceci:

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

Edit:

a été testée et produit les éléments suivants:

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

etc.. 
2

ci-dessous devrait être plus simple et plus facile à suivre:

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) 

sortie:

[{'Dawn:': '07:01', 'Moonrise:': '14:29', 'Sunrise:': '07:26'}, 
{'Dusk:': '18:27', 'Moonset:': '01:55', 'Sunset:&nbsp;': '18:02'}, 
{'Day length:': '10:36', 
    'Daylight:': '11:26', 
    'Moon Phase:': 'Waxing Gibbous'}]