You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:51:05