使用Selenium/BeautifulSoup4抓取Flashscore平台Ajax球队特定数据的技术问询
解决方案
1. 修正代码并提取Ajax数据(排除"?")
首先你的代码里有几处小问题:比如content_list3 = content.find_all(...)里的content应该是content3,而且你定位的是带?的图标元素,不是整行的积分榜数据。我们需要定位每行的ui-table__row元素,再筛选出包含"Ajax"的那一行,同时移除所有?符号。
下面是修正后的代码,会提取Ajax的完整数据并保存为列表:
from selenium import webdriver from bs4 import BeautifulSoup as BS from time import sleep driver = webdriver.Chrome() driver.get("https://www.flashscore.pl/druzyna/ajax/8UOvIwnb/tabela/") sleep(10) # 等待页面加载完成,也可以用WebDriverWait优化 page = driver.page_source soup = BS(page,'html.parser') # 获取积分榜的所有行 table_body = soup.find('div', {'class':'ui-table__body'}) all_rows = table_body.find_all('div', {'class':'ui-table__row'}) ajax_data_list = [] for row in all_rows: row_text = row.text.strip() # 筛选出包含Ajax的行 if "Ajax" in row_text: # 移除所有"?"符号 cleaned_text = row_text.replace("?", "") # 拆分数据:按文本结构拆分各个字段 rank_end = cleaned_text.find("Ajax") rank = cleaned_text[:rank_end].replace(".", "") team = "Ajax" # 拆分场次、胜、平、负 rest = cleaned_text[rank_end+4:] matches = rest[:2] wins = rest[2:4] draws = rest[4:5] losses = rest[5:6] # 拆分进球失球 goal_split_idx = rest.find(":") + 2 goals = rest[6:goal_split_idx] # 拆分积分和最近战绩 points = rest[goal_split_idx:goal_split_idx+2] recent = rest[goal_split_idx+2:] # 组装成列表 ajax_data_list = [rank, team, matches, wins, draws, losses, goals, points, recent] break # 找到Ajax后直接退出循环 driver.quit() print("提取的Ajax数据列表:", ajax_data_list)
运行后会得到类似这样的列表:['2', 'Ajax', '18', '13', '3', '2', '56:4', '42', 'WWPWW'],已经完全移除了?符号。
2. 将数据用";"分隔成指定格式
拿到上面的列表后,只需要用Python的字符串join方法就能快速生成你要的格式:
# 生成分号分隔的字符串 formatted_data = ";".join(ajax_data_list) print("格式化后的输出:", formatted_data)
运行后会输出:2;Ajax;18;13;3;2;56:4;42;WWPWW,如果不需要排名,直接从列表里移除第一个元素再执行join即可。
额外优化建议
- 用
WebDriverWait替代sleep,更可靠地等待页面加载,避免网络波动导致的元素未找到问题:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.flashscore.pl/druzyna/ajax/8UOvIwnb/tabela/") # 等待积分榜主体加载完成,最多等待15秒 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CLASS_NAME, "ui-table__body")) ) page = driver.page_source - 如果要导出到CSV文件,可以直接用Python内置的
csv模块:import csv with open('ajax_stats.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f, delimiter=';') writer.writerow(ajax_data_list)
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

