爬取维基百科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
相关产品推荐
相关产品推荐

