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

爬取维基百科HDI数据后得到空Pandas DataFrame的问题求助

爬取维基百科HDI数据后得到空Pandas DataFrame的问题求助

我帮你排查下问题哈!你遇到空DataFrame的情况,大概率是表格定位或者列索引的逻辑出了问题,咱们一步步来分析:

问题出在哪?

  • 表格选择可能不准确:你用soup.find('table', {'class': 'wikitable'}),但维基百科上这个HDI列表的表格实际带有多个class(比如wikitable sortable),虽然这一步可能能找到表格,但后续行处理的逻辑有漏洞;
  • 行切片和过滤逻辑有问题:你取rows = table.find_all('tr')[1:]跳过了表头,但表格里存在一些分类标题行(比如“Very high human development”),这些行只有<th>标签没有<td>,导致row.find_all('td')返回空列表,你的if len(cols) > 2条件会把所有有效数据行也过滤掉;
  • 列索引未考虑单元格合并:部分行存在合并单元格的情况,导致你预期的列索引位置偏移,无法正确提取数据。

修正后的代码

咱们调整逻辑,更精准地定位有效数据行,同时处理数据格式问题:

import pandas as pd
import requests
from bs4 import BeautifulSoup

html = requests.get('https://en.wikipedia.org/wiki/List_of_countries_by_Human_Development_Index')
soup = BeautifulSoup(html.text, 'html.parser')

# 更精准定位目标表格:带sortable属性的wikitable,避免匹配到页面其他无关表格
table = soup.find('table', {'class': 'wikitable sortable'})
countries = []
hdi_index = []

# 遍历所有行,通过是否存在<td>标签判断是否为有效数据行
for row in table.find_all('tr'):
    cols = row.find_all('td')
    # 有效数据行至少包含4个<td>(排名、国家/地区、HDI值、变化情况等)
    if len(cols) >= 4:
        # 提取国家/地区名称(第2个<td>,索引为1)
        country_name = cols[1].text.strip()
        # 清洗HDI值:去掉多余括号,保留纯数字
        hdi_value = cols[2].text.strip().replace('(', '').replace(')', '')
        countries.append(country_name)
        hdi_index.append(hdi_value)

hdi_df = pd.DataFrame({'Country': countries, 'HDI': hdi_index})
print(hdi_df.head())

关键调整点

  • 精准表格定位:用wikitable sortable缩小匹配范围,避免页面其他表格干扰;
  • 动态过滤有效行:通过判断<td>数量确定是否为数据行,不用提前切片跳过表头,避免遗漏数据;
  • 数据格式清洗:去掉HDI值中的括号,保证数据格式整洁。

你运行修正后的代码,应该就能得到正常的DataFrame啦!

备注:内容来源于stack exchange,提问作者Arbab Qaisar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:39:33