Python结合BeautifulSoup、Pandas批量爬取CSV URL输出异常问题求助
问题根因与修正代码
问题定位
- 数据漏存:原有代码中
drop(0, axis=0)主动删除了提取到的第一条内容,3条数据删除1条后仅保留2条 - 列偏移:每次拼接DataFrame时未重置行索引,转置后原有行索引会转为列名,不同URL的内容就会错位到不同列
- CSV读取URL:直接使用pandas的read_csv方法读取单列URL即可替换硬编码列表
修正后完整代码
import requests from bs4 import BeautifulSoup import pandas as pd # 读取CSV中的URL列表,假设CSV文件名为urls.csv,单列列名为url,根据实际情况修改参数 url_df = pd.read_csv('urls.csv') urls = url_df['url'].tolist() # 存储最终结果的列表 drivers_result = [] challenges_result = [] for url in urls: # 增加超时处理避免请求卡住,可根据网络情况调整参数 page = requests.get(url, timeout=10) soup = BeautifulSoup(page.text, 'html.parser') toc = soup.find("div", id="toc") # 提取驱动因素 drivers = [] for x in toc.select('li:-soup-contains-own("Market drivers") li'): drivers.append(x.get_text(strip=True)) # 按[URL, 驱动1, 驱动2, 驱动3]格式存入结果列表 drivers_result.append([url] + drivers[:3]) # 提取市场挑战 challenges = [] for y in toc.select('li:-soup-contains-own("Market challenges") li'): challenges.append(y.get_text(strip=True).replace('Table Impact of drivers and challenges', '')) # 按[URL, 挑战1, 挑战2, 挑战3]格式存入结果列表 challenges_result.append([url] + challenges[:3]) # 统一转DataFrame导出,列名可按需自行修改 pd.DataFrame(drivers_result, columns=['源URL', '驱动因素1', '驱动因素2', '驱动因素3']).to_csv('detail-dr.csv', index=False, encoding='utf-8-sig') pd.DataFrame(challenges_result, columns=['源URL', '挑战1', '挑战2', '挑战3']).to_csv('detail-ch.csv', index=False, encoding='utf-8-sig')
代码说明
- 去掉了冗余的函数定义和循环内反复写文件的操作,最终统一导出性能更好,也不会出现拼接索引错误
- 增加了
utf-8-sig编码导出,避免CSV打开时乱码 - 切片
[:3]避免个别页面提取到超过3条内容时导出格式错乱 - 输出CSV第一列为源URL,后续三列依次对应提取的三条内容,完全符合期望格式
内容的提问来源于stack exchange,提问作者Michael Wiz
相关产品推荐
相关产品推荐

