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

