You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

爬取秘鲁球队页面:无法将表格对应区域作为列合并数据集求修复

修复秘鲁足球球队维基百科爬虫代码

问题背景

尝试爬取秘鲁足球球队的维基百科页面,目标是提取各区域对应的球队表格,为每个表格的数据集新增「所属区域」列,最终合并为一个完整数据集,但原代码无法实现该需求,问题集中在隐藏标签处理和数据追加环节。

问题分析

原代码存在以下几个关键问题:

  1. 使用html.parser解析器不支持:-soup-contains这类扩展CSS选择器,导致表格筛选不准确
  2. 隐藏标签处理逻辑未覆盖所有情况,部分隐藏内容仍会干扰表格读取
  3. 区域标题获取逻辑未做异常处理,遇到结构不一致的标题时会报错
  4. 表格读取后可能出现多级列名,导致后续数据合并异常

修复后的代码

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")

代码说明

  1. 解析器更换:改用lxml解析器,需先通过pip install lxml安装,解决扩展CSS选择器支持问题
  2. 表格筛选优化:先筛选所有维基标准表格,再通过表头关键词确认目标表格,避免误选无关表格
  3. 隐藏元素处理:使用[style*="display:none"]选择器,覆盖所有包含隐藏样式的元素
  4. 列名处理:自动识别并扁平化多级列名,避免后续数据操作异常
  5. 区域标题获取:增加异常处理,移除标题中的「[editar]」冗余文本,确保区域名称干净准确
  6. 数据合并:使用ignore_index=True重置索引,保证合并后数据集索引连续

内容的提问来源于stack exchange,提问作者Juan Carlos Saravia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:13:12