网页爬取与DataFrame构建求助:列名与数据行映射异常
解决DataFrame构建的列名与数据匹配问题
看起来你已经抓到了核心问题——列名被重复获取导致后续无法正确构建DataFrame,咱们一步步来修正:
问题根源
你的原代码在循环每个交换节点时,都会重复提取列名并追加到info_list,导致列名列表出现大量重复;同时data_list是所有节点的td文本的一维列表,无法和重复的列名对应,自然没法生成正确的表格结构。
修正方案
我们需要只提取一次列名,然后逐个爬取每个交换节点的数据并整理成对应行,最后用这些行数据和唯一的列名构建DataFrame:
import requests from bs4 import BeautifulSoup import pandas as pd mini_exc = ['CLFAR', 'CLFLE', 'CLHOL', 'CLCAN', 'CLCLE'] # 第一步:仅提取一次列名(从第一个交换节点页面获取) first_exchange = mini_exc[0] response = requests.get(f"http://availability.samknows.com/broadband/exchange/{first_exchange}") soup = BeautifulSoup(response.content, 'html.parser') # 定位到包含表头的区域 header_container = soup.find('div', class_='item-content') # 提取并清洗表头文本 column_names = [th.text.strip() for th in header_container.findAll('th')] # 第二步:爬取所有交换节点的数据并整理成行 rows_data = [] for exc in mini_exc: response = requests.get(f"http://availability.samknows.com/broadband/exchange/{exc}") soup = BeautifulSoup(response.content, 'html.parser') data_container = soup.find('div', class_='item-content') # 提取当前节点的所有数据单元格并清洗 row = [td.text.strip() for td in data_container.findAll('td')] # 校验数据长度与列名是否匹配,避免构建DataFrame时出错 if len(row) == len(column_names): rows_data.append(row) else: print(f"⚠️ 交换节点 {exc} 的数据长度与列名不匹配,已跳过") # 第三步:构建目标DataFrame df = pd.DataFrame(rows_data, columns=column_names) print(df)
关键细节说明
- 列名仅提取一次:确保
column_names是唯一的表头列表,不会出现重复 - 数据按行整理:每个交换节点的数据被整理成一个子列表,最终
rows_data是二维列表,每个子列表对应表格的一行 - 文本清洗:使用
strip()去除文本中的多余空格、换行符,让表格数据更整洁 - 长度校验:避免因个别页面结构异常导致的DataFrame构建失败
内容的提问来源于stack exchange,提问作者Luigi
相关产品推荐
相关产品推荐

