Python+Selenium循环无返回值:网页爬取空DataFrame问题求助
网页爬取空DataFrame问题排查与修复
你遇到的核心问题是无法定位到比赛数据的表格行元素,导致循环无输出、DataFrame为空,主要原因是Selenium版本兼容问题和等待机制不够可靠,以下是具体修复方案:
问题根源
- 过时的元素定位API:你使用的
find_element_by_xpath、find_elements_by_tag_name是Selenium 3及更早版本的写法,Selenium 4+已弃用这类方法,会导致元素定位失败。 - 等待机制不可靠:固定的
time.sleep(5)不能保证表格完全加载完成,尤其是网络波动时,可能在元素渲染前就执行了获取操作。
修复后的代码
from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd website = 'https://www.adamchoi.co.uk/teamgoals/detailed' path = r'C:/Users/Ronald C/Downloads/Data Analyst Portfolio Porjects/Project 5 Web Scrapping/chromedriver.exe' # 初始化浏览器 driver = webdriver.Chrome(path) driver.get(website) # 点击"All matches"按钮(使用新的定位API) all_matches_button = driver.find_element(By.XPATH, '//label[@analytics-event="All matches"]') all_matches_button.click() # 选择国家和赛季 drop_country = Select(driver.find_element(By.ID, 'country')) drop_country.select_by_visible_text('Spain') drop_season = Select(driver.find_element(By.ID, 'season')) drop_season.select_by_visible_text('21/22') # 显式等待表格加载完成,最多等待10秒 wait = WebDriverWait(driver, 10) matches = wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, 'tr'))) # 测试打印数据 for match in matches: print(match.text) # 构建DataFrame并导出CSV match_data = [] for match in matches: cols = match.text.split('\n') if len(cols) >= 5: # 确保是有效比赛行 match_data.append({ '日期': cols[0], '主队': cols[1], '比分': cols[2], '客队': cols[3], '赛事': cols[4] }) df = pd.DataFrame(match_data) df.to_csv('spain_2122_matches.csv', index=False, encoding='utf-8-sig') driver.quit()
关键修改点
- 导入
By、WebDriverWait和expected_conditions模块,用于新的定位和显式等待。 - 替换所有
find_element_by_*为find_element(By.*, 定位值)的写法。 - 使用
WebDriverWait等待表格行元素出现,替代固定sleep,确保元素加载完成后再获取。 - 增加数据有效性判断,过滤掉表头或无效行,避免DataFrame出现异常。
内容的提问来源于stack exchange,提问作者Ramón Córdova
相关产品推荐
相关产品推荐

