爬取秘鲁球队页面:无法将表格对应区域作为列合并数据集求修复
修复秘鲁足球球队维基百科爬虫代码
问题背景
尝试爬取秘鲁足球球队的维基百科页面,目标是提取各区域对应的球队表格,为每个表格的数据集新增「所属区域」列,最终合并为一个完整数据集,但原代码无法实现该需求,问题集中在隐藏标签处理和数据追加环节。
问题分析
原代码存在以下几个关键问题:
- 使用
html.parser解析器不支持:-soup-contains这类扩展CSS选择器,导致表格筛选不准确 - 隐藏标签处理逻辑未覆盖所有情况,部分隐藏内容仍会干扰表格读取
- 区域标题获取逻辑未做异常处理,遇到结构不一致的标题时会报错
- 表格读取后可能出现多级列名,导致后续数据合并异常
修复后的代码
import requests import pandas as pd from bs4 import BeautifulSoup # 爬取秘鲁足球球队维基百科数据 url = "https://es.wikipedia.org/wiki/Anexo:Clubes_de_fútbol_del_Perú" dfs = [] # 使用lxml解析器,支持更丰富的CSS选择器 soup = BeautifulSoup(requests.get(url).content, "lxml") # 筛选带有指定表头的维基百科标准表格 tables = soup.find_all("table", class_="wikitable") target_tables = [] for table in tables: # 检查表格是否包含目标表头 headers = [th.get_text(strip=True) for th in table.find_all("th")] required_headers = {"Equipo", "Ciudad", "Fundación", "Estadio", "Liga"} if required_headers.intersection(headers): target_tables.append(table) for table in target_tables: # 移除所有隐藏元素(包括style="display:none"的标签) for hidden_tag in table.select('[style*="display:none"]'): hidden_tag.extract() # 读取表格,处理多级列名 df = pd.read_html(str(table), header=0)[0] # 扁平化多级列名 if isinstance(df.columns, pd.MultiIndex): df.columns = [' '.join(col).strip() for col in df.columns.values] # 获取所属区域标题 region_elem = table.find_previous(["h2", "h3"]) if region_elem: # 提取标题文本,处理可能的span或直接文本 region_text = region_elem.get_text(strip=True).replace("[editar]", "") df["Region"] = region_text else: df["Region"] = "未知区域" dfs.append(df) # 合并所有数据集 final_df = pd.concat(dfs, ignore_index=True) # 查看合并后的数据前5行 print(final_df.head()) # 保存到CSV final_df.to_csv("/Users/home/Downloads/peru_football_teams.csv", index=False, encoding="utf-8-sig")
代码说明
- 解析器更换:改用
lxml解析器,需先通过pip install lxml安装,解决扩展CSS选择器支持问题 - 表格筛选优化:先筛选所有维基标准表格,再通过表头关键词确认目标表格,避免误选无关表格
- 隐藏元素处理:使用
[style*="display:none"]选择器,覆盖所有包含隐藏样式的元素 - 列名处理:自动识别并扁平化多级列名,避免后续数据操作异常
- 区域标题获取:增加异常处理,移除标题中的「[editar]」冗余文本,确保区域名称干净准确
- 数据合并:使用
ignore_index=True重置索引,保证合并后数据集索引连续
内容的提问来源于stack exchange,提问作者Juan Carlos Saravia
相关产品推荐
相关产品推荐

