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

Selenium+Python爬取Merkurbets赛事数据失败求助

爬取Merkurbets赛事赔率时Selenium无法定位元素的问题

疑问与背景

我尝试用Python+Selenium爬取Merkurbets网站的赛事及赔率数据,遇到一个疑问:带有team-name类的元素如下,其中div标签的_ngcontent-ng-c1043474636属性是否会影响Selenium获取该div的文本内容?

<div _ngcontent-ng-c1043474636="" class="team-name">FAC Wien</div>

尝试的定位方法示例

示例1:通过完整XPATH定位单场赛事元素

我尝试过通过完整XPATH定位赛事元素并提取数据,但返回空列表:

# games_elements = driver.find_elements(By.XPATH, '//*[@id="cdk-accordion-child-3"]/div/div/games-list-partial/div')
games_elements = driver.find_elements(By.XPATH,'//*[@id="cdk-accordion-child-3"]/div/div/games-list-partial/div/games-list-game[1]')
print('games_elements: ', games_elements)
for game in games_elements:

    try:
        # 提取球队名称
        teams = game.find_elements(By.XPATH, './/*[@id="cdk-accordion-child-3"]/div/div/games-list-partial/div/games-list-game[1]/div/div[1]/div/game-details-summary/div/div/div/div[1]')
        # 提取赔率
        odds = game.find_elements(By.XPATH, './/*[@id="cdk-accordion-child-3"]/div/div/games-list-partial/div/games-list-game[1]/div/div[2]/div[1]/market/div/div[2]/div/tip[1]/div/button/span[2]/div/tip-odds/div/div')

        if len(teams) == 2 and len(odds) >= 3:
            home_team = teams[0].text
            away_team = teams[1].text
            home_odds = odds[0].text
            draw_odds = odds[1].text
            away_odds = odds[2].text

            games_data.append({
                "Home Team": home_team,
                "Away Team": away_team,
                "Home Odds": home_odds,
                "Draw Odds": draw_odds,
                "Away Odds": away_odds,
                "Zeitstempel": timestamp  # 时间戳
            })
        else:
            logging.warning("发现异常数量的球队或赔率。")
    except NoSuchElementException as e:
        logging.error(f"提取单场赛事数据出错: {e}")

示例2:使用显式等待定位team-name元素

我也尝试过用显式等待等待元素可见,但依然无法获取:

# 备选方案:尝试更长等待时间并检查可见性
wait = WebDriverWait(driver, 30)
try:
    # 获取可见的'team-name'元素
    team_name_element = wait.until(
        EC.visibility_of_element_located((By.CLASS_NAME, "team-name"))
    )
    print(team_name_element.text)
except Exception as e:
    print(f"错误: {e}")
finally:
    # 保存页面内容用于检查
    page_source = driver.page_source
    with open('page_source.html', 'w', encoding='utf-8') as f:
        f.write(page_source)
    print("HTML内容已保存。")

示例3:完整流程(含Cookie接受与滚动)

每次爬取都会先接受Cookie并滚动页面到底部,但还是无法定位到元素:

def scroll(driver):
    height = driver.execute_script("return document.body.scrollHeight")
    print('height: ', height)
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
        time.sleep(1) # <- 传统方法
        hnow = driver.execute_script("return document.body.scrollHeight")
        print('hnow: ', hnow)
        if hnow == height:
            break
        height = hnow

# 启动WebDriver
chrome_options = Options()
# chrome_options.add_argument("--headless")  # 可选:不显示窗口
service = Service(executable_path="/usr/bin/chromedriver")  # chromedriver路径
driver = webdriver.Chrome(service=service, options=chrome_options)

# 打开网页
driver.get("https://www.merkurbets.de/de/sports/0/s1/1")
driver.maximize_window()
time.sleep(5)
# 接受Cookie
accept_button = driver.find_element(By.XPATH, '//*[@id="cookiescript_accept"]')
accept_button.click()
time.sleep(2)
scroll(driver)
# 等待10秒(仅用于调试)
time.sleep(2)
team = driver.find_elements(By.XPATH,  './/div[contains(@class,"team-name")]')

求助

我尝试了XPATH、CSS_SELECTOR、CLASS_NAME等多种定位方式,但每次都得到空列表,无法获取目标元素,恳请提供解决思路。

内容的提问来源于stack exchange,提问作者sticki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:48:10