使用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
相关产品推荐
相关产品推荐

