2010-11-15 42 views
5

Tôi đã sử dụng BeautifulSoup trong quá khứ nhưng tôi chống lại điều gì đó mới mẻ; đánh dấu bảng HTML cực kỳ chung chung/tối thiểu ... Mục tiêu của tôi là lấy từng giá trị và nhãn của nó (mỗi cái có td) và in chúng ra ... Chúng có thể được hợp nhất, tôi không quan tâm, tôi chỉ muốn làm đảm bảo mỗi nhãn được áp dụng cho giá trị chính xác. Dưới đây là một bảng ví dụ:Phân tích cú pháp Bảng HTML với 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> 

tôi biết làm thế nào để lấy các giá trị ...

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

nhưng điều này chỉ mang lại cho tôi ....

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

Tôi đoán tôi có thể lấy các giá trị lớp "nhãn" và "site_data" nhưng làm cách nào để đảm bảo nhãn và dữ liệu được nhóm chính xác?

Trả lời

2

Tôi không phải là một chuyên gia BeautifulSoup, nhưng bạn có thể thử một cái gì đó như thế này:

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:

Tested và sản xuất như sau:

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

etc.. 
2

Sau đây nên đơn giản và dễ dàng hơn để làm theo:

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) 

đầu ra:

[{'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'}] 
Các vấn đề liên quan