2010-11-15 23 views
5

Używałem BeautifulSoup w przeszłości, ale jestem przeciwko nowemu; niewiarygodnie ogólny/minimalny znacznik tabeli HTML ... Moim celem jest uchwycenie każdej wartości i jej etykiety (każda w osobnej td) i wydrukowanie ich ... Mogą być połączone, nie obchodzi mnie, po prostu chcę zrobić upewnij się, że każda etykieta zostanie zastosowana do poprawnej wartości. Oto przykład tabela:Parsowanie tabel HTML przy użyciu 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> 

wiem jak chwycić te wartości ...

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

ale to tylko daje mi ....

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

Chyba mogłem chwyć te "etykiety" wartości klas i "site_data", ale jak mogę się upewnić, że etykiety i dane są zgrupowane poprawnie?

Odpowiedz

2

Nie jestem ekspertem BeautifulSoup, ale można spróbować czegoś takiego:

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:

Przetestowane i produkuje następujące:

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

etc.. 
2

Poniższy powinno być prostsze i łatwiejsze do wykonania:

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) 

moc wyjściowa:

[{'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'}] 
Powiązane problemy