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

Python网页爬取:遍历循环读取表格遇索引越界问题求助

解决维基百科小行星表格爬取的索引越界问题

你的代码遍历表格行时能正常打印HTML片段,但提取单元格内容触发“col[0]索引越界”错误,核心原因是表格里不是所有<tr>都包含<td>数据单元格——比如表头行用的是<th>标签,还有可能存在空行,这类行调用row.find_all("td")会返回空列表,访问col[0]自然报错。

另外原代码直接存储bs4的Tag对象到DataFrame,最终得到的不是可用文本数据,而且append方法效率极低,建议改用列表批量收集数据。

修复后的代码如下:

import requests
import pandas as pd
from bs4 import BeautifulSoup

url = "https://en.wikipedia.org/wiki/List_of_exceptional_asteroids"
data = requests.get(url)
soup = BeautifulSoup(data.text, "html5lib")

# 定义列名
columns = ["Name", "Diameter (km)", "Dimensions (km)", "Mean Distance from Sun", 
           "Inclination", "Date Discovered", "Discoverer", "Class"]
# 用列表批量收集行数据
row_list = []

# 遍历表格所有行
for row in soup.find('table').find("tbody").find_all("tr"):
    col = row.find_all("td")
    # 只处理有足够数据单元格的行
    if len(col) >= 9:
        # 提取单元格纯文本,去除多余空格和换行
        name = col[0].get_text(strip=True)
        diameter = col[2].get_text(strip=True)
        dimensions = col[3].get_text(strip=True)
        mean_distance = col[4].get_text(strip=True)
        inclination = col[5].get_text(strip=True)
        date_discovered = col[6].get_text(strip=True)
        discoverer = col[7].get_text(strip=True)
        asteroid_class = col[8].get_text(strip=True)
        
        # 将当前行数据加入列表
        row_list.append([name, diameter, dimensions, mean_distance, 
                        inclination, date_discovered, discoverer, asteroid_class])

# 用列表批量生成DataFrame
meteor_data = pd.DataFrame(row_list, columns=columns)
print(meteor_data)

关键修复说明:

  • 增加if len(col) >=9判断,过滤掉表头、空行这类无数据的行
  • 使用get_text(strip=True)提取单元格纯文本,避免存储无用的Tag对象
  • 改用列表收集数据后批量生成DataFrame,比循环append效率提升明显
  • 确认列索引与实际表格结构匹配(原表格中直径确实对应第3个<td>,索引为2)

内容的提问来源于stack exchange,提问作者Trevor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:05:24