如何用BeautifulSoup遍历tr元素抓取复杂体育博彩表格数据
体育博彩爬虫:复杂表格数据提取方案
需求说明
需从指定HTML表格中提取以下信息:
- 赛事时间、日期
- 两位参与者姓名
- 额外市场数量(+4)
- 对应赔率
- 参与者上方的赛事链接
表格典型HTML结构:
<tr data-qa="pre-event" class="events-list__grid__event"><th scope="row" class="events-list__grid__info"><div class="events-list__grid__info__datetime"><div class="events-list__grid__info__datetime__time"> 20:05 </div> <div class="events-list__grid__info__datetime__date"> 24/07 </div></div> <a href="/cote/sara-errani-paula-ormaechea/27034463/" class="GTM-event-link events-list__grid__info__main" data-testid="TENN" title="WTA - Varșovia - Calificări (F)"><div class="events-list__grid__info__main__row"><div class="events-list__grid__info__main__participants"><div class="events-list__grid__info__main__participants__participant"><span class="events-list__grid__info__main__participants__participant-name"><!----> Sara Errani <!----></span> <!----></div><div class="events-list__grid__info__main__participants__participant"><span class="events-list__grid__info__main__participants__participant-name"><!----> Paula Ormaechea <!----></span> <!----></div> <!----></div> <div class="events-list__grid__info__main__actions"><span class="event-icons"><!----> <!----> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" svg-inline="" role="presentation" focusable="false" tabindex="-1" class="icon--color-cloud-burst-500 icon--clickable kz-icon-xs has-tooltip" data-original-title="null"><path d="M18.545 6H5.455C4.655 6 4 6.668 4 7.5v9c0 .825.655 1.5 1.455 1.5h13.09c.8 0 1.455-.675 1.455-1.5v-9c0-.832-.655-1.5-1.455-1.5zm0 10.5H5.455v-9h13.09v9zM9.818 9v6l5.091-3-5.09-3z"></path></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" svg-inline="" role="presentation" focusable="false" tabindex="-1" class="icon--color-cloud-burst-500 kz-icon icon--clickable kz-icon-xs has-tooltip" data-original-title="null"><path d="M7.833 19.5H9.5V8.03H7.833V19.5zm3.334 0h1.666v-15h-1.666v15zm-6.667 0h1.667v-7.941H4.5V19.5zm10 0h1.667V8.03H14.5V19.5zm3.333-7.941V19.5H19.5v-7.941h-1.667z"></path></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" svg-inline="" role="presentation" focusable="false" tabindex="-1" class="icon--color-cloud-burst-500 icon--clickable kz-icon-xs has-tooltip" data-original-title="null"><path d="M14.2 4.534a.532.532 0 00-.344-.504.503.503 0 00-.572.17l-6.07 7.862a.96.96 0 00-.131.996c.147.33.466.542.817.542h1.928c.142 0 .258.12.258.267v5.6c0 .226.138.428.344.503a.503.503 0 00.572-.17l6.07-7.862a.96.96 0 00.13-.996.899.899 0 00-.817-.542h-1.928a.262.262 0 01-.257-.267v-5.6z"></path></svg> <!----> <!----></span> <!----></div></div> <!----></a></th> <td class="table__markets__market"><div><section><div class="table__markets__market__title"><div class="table__markets__market__title__text"> Câştigător </div> <div class="table__markets__market__title__markets"><a href="/cote/sara-errani-paula-ormaechea/27034463/" class="table__markets__market__title__markets__link"> +4 </a></div></div> <div class="selections"><button aria-label="Bet on Sara Errani with odds 1.17." data-selnid="2685084631" data-qa="pre-event-selection" class="selections__selection selections__selection--columns-2 GTM-selection-add" mc-data="[object Object]" event-url=""><!----> <!----> <!----> <!----> <span class="selections__selection__odd"><!--fragment#15ac200c85#head--> 1.17 <!--fragment#15ac200c85#tail--></span></button><button aria-label="Bet on Paula Ormaechea with odds 4.6." data-selnid="2685084632" data-qa="pre-event-selection" class="selections__selection selections__selection--columns-2 GTM-selection-add" mc-data="[object Object]" event-url=""><!----> <!----> <!----> <!----> <span class="selections__selection__odd"><!--fragment#80111e10a3#head--> 4.60 <!--fragment#80111e10a3#tail--></span></button> <!----></div></section></div></td><td class="table__markets__market"></td><td class="table__markets__market"></td> <td class="events-list__grid__total-markets"> +4 </td></tr>
提取实现(Python + BeautifulSoup)
遍历所有目标行,精准定位元素提取数据:
from bs4 import BeautifulSoup # 假设html_content为获取到的页面HTML内容 soup = BeautifulSoup(html_content, 'html.parser') # 遍历所有赛事行 for event_row in soup.select('tr[data-qa="pre-event"]'): # 提取时间、日期 event_time = event_row.select_one('.events-list__grid__info__datetime__time').get_text(strip=True) event_date = event_row.select_one('.events-list__grid__info__datetime__date').get_text(strip=True) # 提取赛事链接 event_link = event_row.select_one('.events-list__grid__info__main')['href'] # 提取参与者姓名 participant_names = [ p.get_text(strip=True) for p in event_row.select('.events-list__grid__info__main__participants__participant-name') ] # 提取额外市场数 market_count = event_row.select_one('.table__markets__market__title__markets__link').get_text(strip=True) # 提取赔率 odds_values = [ o.get_text(strip=True) for o in event_row.select('.selections__selection__odd') ] # 整理结果 event_data = { '时间': event_time, '日期': event_date, '参与者': participant_names, '赛事链接': event_link, '额外市场数': market_count, '赔率': odds_values } print(event_data)
关键说明
- 用
tr[data-qa="pre-event"]定位所有赛事行,避免无关数据干扰 - 通过类名逐层定位子元素,
get_text(strip=True)自动去除文本中的空格、换行 - 若需兼容元素缺失场景,可给每个提取步骤添加空值判断(如
elem.get_text(...) if elem else None)
内容的提问来源于stack exchange,提问作者goldie
相关产品推荐
相关产品推荐

