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

如何用Beautiful Soup抓取URL并存入pandas DataFrame?

问题排查

你的代码存在3处核心错误:

  • 缩进错误:拼接清洗文本、生成Series、追加DataFrame的逻辑被放在了td遍历的循环内部,会导致每处理一个单元格就生成一次不完整的行,触发DataFrame列长度不匹配的报错
  • 字段顺序错误:你期望的输出顺序是「课程名、全日制URL、全日制代码、非全日制URL、非全日制代码」,但原有代码是先存单元格文本、再存链接,实际产出的顺序是「课程名、全日制代码、全日制URL、非全日制代码、非全日制URL」,和需求不符
  • 空值未处理:部分仅开放非全日制申请的课程,对应的全日制td是空值,你直接跳过空td的逻辑会导致整行字段数量不足,无法匹配预设的5列表结构

修正后可运行代码

import pandas as pd
from bs4 import BeautifulSoup

# 预设DataFrame列名,对应 课程名、全日制URL、全日制代码、非全日制URL、非全日制代码
df = pd.DataFrame(columns=['course_name', 'full_time_url', 'full_time_code', 'part_time_url', 'part_time_code'])

for row in rows:
    tds = row.find_all('td')
    # 初始化每行的5个字段,默认空值
    row_data = [''] * 5
    # 提取第一个td的文本作为课程名
    row_data[0] = tds[0].get_text(strip=True)
    
    # 处理第二个td:全日制信息
    ft_a = tds[1].find('a')
    if ft_a:
        row_data[1] = ft_a['href']
        row_data[2] = ft_a.get_text(strip=True)
    
    # 处理第三个td:非全日制信息
    pt_a = tds[2].find('a')
    if pt_a:
        row_data[3] = pt_a['href']
        row_data[4] = pt_a.get_text(strip=True)
    
    # 追加到DataFrame
    df.loc[len(df)] = row_data

# 输出查看结果
print(df)
# 如果需要输出你要的逗号分隔字符串格式,可以用apply拼接:
df['output_str'] = df.apply(lambda x: ','.join([i for i in x if i]), axis=1)
print(df['output_str'])

运行说明

  • 代码会自动适配空值情况,只有非全日制入口的课程对应的全日制URL和代码字段会留空
  • 最终生成的DataFrame完全匹配你需要的字段顺序,可直接用to_csv()等方法导出结果
  • 如果你需要原需求的逗号拼接文本,直接取output_str列即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:54:00