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

在Google Colab中无法抓取Fbref.com第2个表格,请求技术排查

解决fbref页面第二个表格无法用pd.read_html抓取的问题

问题描述

在Google Colab中使用pd.read_html("https://fbref.com/en/comps/82/stats/Indian-Super-League-Stats#all_stats_standard")时,只能获取页面的第一个表格,无法抓取目标的第二个表格(对应截图中的球员数据表格)。

问题原因

  1. fbref网站的部分表格(比如带#all_前缀锚点的表格)默认是前端隐藏状态,服务器返回的初始HTML中并没有包含这些表格的完整数据,需要通过JavaScript动态加载或触发显示后才会渲染出来。
  2. pd.read_html仅能解析页面初始HTML里的静态表格,无法处理JavaScript动态生成的内容,因此默认只能抓取到第一个可见的静态表格。

解决方案

方案1:结合requests+BeautifulSoup提取目标表格

通过请求页面HTML,直接定位到目标隐藏表格的HTML代码,再用pd.read_html解析:

  1. 安装依赖(Colab中执行):
    !pip install requests beautifulsoup4 pandas
    
  2. 代码示例:
    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    url = "https://fbref.com/en/comps/82/stats/Indian-Super-League-Stats#all_stats_standard"
    # 模拟浏览器请求,避免被网站反爬拦截
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 直接通过表格id定位目标表格(隐藏表格的id是all_stats_standard)
    target_table = soup.find('table', id='all_stats_standard')
    if target_table:
        df = pd.read_html(str(target_table))[0]
        # 查看前5行数据
        print(df.head())
    else:
        print("未找到目标表格,请检查表格id是否正确")
    

方案2:使用Selenium模拟浏览器加载动态内容

如果页面动态渲染逻辑更复杂,可通过Selenium模拟完整浏览器加载过程,确保所有表格都被渲染:

  1. 安装依赖(Colab中执行):
    !pip install selenium pandas webdriver-manager
    
  2. 代码示例:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import pandas as pd
    from webdriver_manager.chrome import ChromeDriverManager
    
    # 配置Colab无头浏览器(无界面运行)
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    
    # 初始化浏览器并加载页面
    driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
    driver.get("https://fbref.com/en/comps/82/stats/Indian-Super-League-Stats#all_stats_standard")
    
    # 读取页面中所有已渲染的表格
    tables = pd.read_html(driver.page_source)
    # 目标表格为第二个,取索引1(索引从0开始)
    print(tables[1].head())
    
    # 关闭浏览器
    driver.quit()
    

内容的提问来源于stack exchange,提问作者Footilytics - Indian football

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:20:26