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

网页爬取与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:48:14