如何用Selenium和BeautifulSoup提取网页表格并按页存储为结构化字典
代码调整方案
原代码问题原因
- 缺失
time、BeautifulSoup依赖导入 - 选择器逻辑错误:未区分表格的表头行和数据行,直接将整行文本作为字典键,也没有按列汇总同字段的多组数据,导致输出结构混乱
- 未按要求给每页数据加
p+页码的外层键
完整修正代码
import time from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager s=Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=s) driver.maximize_window() # 打开谷歌的冗余代码可以直接删除 # driver.get('https://www.google.com') all_data = [{}] # 外层为列表,和你预期的结构完全匹配 for i in range(1,6): url = "https://www.transfermarkt.co.uk/silvio-adzic/profil/spieler/{}".format(i) driver.get(url) time.sleep(3) # 初始化当前页的数据结构 page_data = { "competition": [], "Appearances": [], "Goals": [], "Assists": [] } soup = BeautifulSoup(driver.page_source, 'html5lib') print(f"In Page {i}") # 抓取表格所有行,第一行是表头直接跳过,从第二行开始遍历数据 tr_list = soup.select("#yw2 tr") if not tr_list: # 无有效数据直接存空 all_data[0][f"p{i}"] = page_data continue for tr in tr_list[1:]: td_list = tr.find_all("td") if len(td_list) <4: continue # 按列对应提取字段,列顺序可根据实际表格结构调整 page_data["competition"].append(td_list[0].get_text(strip=True)) page_data["Appearances"].append(td_list[1].get_text(strip=True) if td_list[1].get_text(strip=True) else "-") page_data["Goals"].append(td_list[2].get_text(strip=True) if td_list[2].get_text(strip=True) else "-") page_data["Assists"].append(td_list[3].get_text(strip=True) if td_list[3].get_text(strip=True) else "-") # 存入总数据集 all_data[0][f"p{i}"] = page_data # 输出验证结果 print(all_data)
调整说明
- 直接预设统一的表头键名,避免原网页德英混合文本生成乱键
- 遍历数据行时按列提取对应字段存入列表,结构清晰
- 自动给每页数据加上
p+页码的外层键,完全匹配预期输出格式 - 空值自动替换为
-,和示例效果一致
内容的提问来源于stack exchange,提问作者Stackbeans
相关产品推荐
相关产品推荐

