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

使用Selenium爬取JS渲染赛事赔率:球队与赔率遍历提取难题

解决Selenium+BeautifulSoup爬取赛事赔率的遍历问题

嘿,我来帮你搞定这个爬取赛事赔率的难题!你遇到的情况其实挺常见的,咱们一步步来捋清楚怎么解决。

问题根源分析

你提到的find_all()无法调用get_text(),大概率是因为find_all()返回的结果里混进了非Tag类型的元素(比如页面中的换行符、注释节点),这些元素没有get_text()方法,自然会报错;而find()只返回第一个符合条件的Tag元素,所以能正常调用,但只能拿到首个球队信息,没法遍历所有内容。

解决方案1:优化BeautifulSoup的使用方式

先确保Selenium已经拿到完全渲染后的页面源码,再用BeautifulSoup过滤有效元素进行遍历:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

# 初始化浏览器驱动
driver = webdriver.Chrome()
driver.get("你的目标赛事页面URL")

# 用显式等待确保页面元素完全渲染(比sleep更可靠)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "匹配赛事项的CSS选择器")))

# 获取渲染后的页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")

# 定位所有赛事项容器(示例:假设每个赛事是class为match-item的div)
match_containers = soup.find_all("div", class_="match-item")

for container in match_containers:
    # 定位当前赛事下的所有球队名称和赔率元素
    team_elements = container.find_all("span", class_="team-name")  # 替换成实际的球队选择器
    odds_elements = container.find_all("span", class_="odds")       # 替换成实际的赔率选择器
    
    # 遍历配对的球队和赔率,先过滤非Tag元素
    for team, odd in zip(team_elements, odds_elements):
        if hasattr(team, "get_text") and hasattr(odd, "get_text"):
            team_name = team.get_text(strip=True)
            odd_value = odd.get_text(strip=True)
            print(f"球队:{team_name} | 赔率:{odd_value}")

driver.quit()

解决方案2:直接用Selenium遍历元素(更省心)

既然已经用了Selenium处理JS渲染,其实可以跳过BeautifulSoup,直接用Selenium的find_elements()方法遍历所有元素,这样更直接:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("你的目标赛事页面URL")

wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "匹配赛事项的CSS选择器")))

# 直接获取所有赛事容器
match_containers = driver.find_elements(By.CSS_SELECTOR, "div.match-item")

for container in match_containers:
    # 获取当前赛事下的所有球队和赔率元素
    teams = container.find_elements(By.CSS_SELECTOR, "span.team-name")
    odds = container.find_elements(By.CSS_SELECTOR, "span.odds")
    
    # 遍历输出
    for team, odd in zip(teams, odds):
        print(f"球队:{team.text.strip()} | 赔率:{odd.text.strip()}")

driver.quit()

关键注意事项

  • 必须用显式等待:不要用time.sleep(),确保页面中需要的元素完全渲染后再进行提取,避免拿到空元素。
  • 选择器要精准:根据目标网站的实际HTML结构,调整CSS选择器或XPath,确保只定位到包含球队和赔率的有效元素。
  • 元素配对要对应:确保球队和赔率的数量一致,用zip()配对时不会出现错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:43:04