Если вы посмотрите на структуру страницы, то увидите, что имя события, которое вы найдете в первом цикле, заключено в таблицу, в которой есть все другие полезные детали в виде пар ячеек в строках таблицы. Итак, я бы просто сделал один цикл, и каждый раз, когда вы находите имя события, ищите вмещающую таблицу и находите все события под этим. Кажется, это работает хорошо:
soup = BeautifulSoup(html)
event_names = soup.findAll(attrs= {"class" : "SpanEventName"})
for event in event_names:
txt = event.find(text=True)
print "Event name: "+txt.strip()
# Find each parent in turn until we find the table that encloses
# the event details:
parent = event.parent
while parent and parent.name != "table":
parent = parent.parent
if not parent:
raise Exception, "Failed to find a <table> enclosing the event"
# Now parent is the table element, so look for every
# row under that table, and then the cells under that:
for row in parent.findAll('tr'):
cells = row.findAll('td')
# We only care about the rows where there is a multiple of two
# cells, since these are the key / value pairs:
if len(cells) % 2 != 0:
continue
for i in xrange(0,len(cells),2):
key_text = cells[i].find(text=True)
value_text = cells[i+1].find(text=True)
if key_text and value_text:
print " Key:",key_text.strip()
print " Value:",value_text.strip()
Вывод выглядит так:
Event name: Columbia Grape Escape 2011
Key: Category:
Value: Mountain Biking Events
Key: Event Date:
Value: 4 March 2011 to 6 March 2011
Key: Entries Close:
Value: 31 January 2011 at 23:00
Key: Venue:
Value: Eden on the Bay, Blouberg
Key: Province:
Value: Western Cape
Key: Distance:
Value: 3 Day, 3 Stage Race (228km)
Key: Starting Time:
Value: -1:-1
Key: Timed By:
Value: RaceTec
Event name: Investpro MTB Race 2011
Key: Category:
Value: Mountain Biking Events
Key: Event Date:
Value: 5 March 2011
Key: Entries Close:
Value: 25 February 2011 at 23:00
... и т. Д.