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
相关产品推荐
相关产品推荐

