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

使用Beautiful Soup爬取大学排名时tbody数据缺失问题求助

问题原因分析

页面表格的tbody数据是JavaScript动态渲染的,你调用driver.get()后立刻获取page_source时,表格内容还未完全加载完成,因此BeautifulSoup解析不到目标数据。另外该页面的排名数据可能需要滚动页面才会逐步加载更多内容。

解决方案

1. 等待页面渲染完成

使用Selenium的显式等待机制,等待表格的tbody元素出现后再获取页面源码,确保数据已加载。

2. 处理滚动加载(可选)

如果需要抓取全部大学数据,需模拟滚动页面,触发下方未加载内容的渲染。

修改后的完整代码

import selenium
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
import time

driver = webdriver.Chrome('./chromedriver.exe')
driver.get('https://roundranking.com/ranking/world-university-rankings.html#world-2021')

try:
    # 显式等待tbody元素加载,最长等待10秒
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, 'tbody'))
    )
    
    # 滚动页面加载全部数据(重复3次确保加载完整)
    for _ in range(3):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)  # 等待新内容渲染
    
    # 获取完整渲染后的页面源码
    source = driver.page_source
    soup = BeautifulSoup(source, 'lxml')
    
    table = soup.find('table', {'class':'big-table table-sortable uci'})
    tbody = table.find('tbody')
    
    # 提取目标数据
    for row in tbody.find_all('tr'):
        cols = row.find_all('td')
        rank = cols[0].text.strip()
        university = cols[1].find('a').text.strip()
        score = cols[2].text.strip()
        country = cols[3].text.strip()
        print(f"排名: {rank}, 大学: {university}, 分数: {score}, 国家: {country}")
        
finally:
    driver.quit()

关键修改说明

  • 显式等待:替代直接获取源码,确保tbody元素已被渲染到页面中。
  • 滚动加载处理:通过JS脚本滚动到页面底部,配合等待时间触发更多数据加载,避免只抓取到页面初始可见的部分内容。
  • 数据提取:定位到tbody后,遍历每一行tr,精准提取大学名称、分数和国家信息。
额外排查点

如果仍无法获取tbody数据,可检查:

  • 浏览器驱动版本是否与Chrome版本兼容,版本不匹配可能导致页面渲染异常。
  • 页面是否存在反爬机制,可适当延长等待时间或添加简单的交互操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:35:31