Python爬虫求助:在抓取的赛事表格首列添加赛事标题
解决赛事标题添加到表格首列的问题
我帮你梳理下代码里的核心问题,然后给出修正后的完整版本,顺便帮你提前处理空行的需求:
原代码的主要问题
- 标题获取逻辑错误:
soup.find('title')返回的是单个<title>标签对象,不需要用for循环遍历,直接调用.get_text()就能拿到赛事标题文本。 writer作用域失效:你把writer定义在第一个with open块内,当这个块结束后文件会自动关闭,后续循环里的writer会报错无法写入数据。- 标题插入方式不符合需求:你现在是单独把标题写一行,而实际需要把标题加到每一行数据的首列,需要在构造每行数据时做前置处理。
修正后的完整代码
# list of needed packages import requests from bs4 import BeautifulSoup import time import csv # create string of urls to scrape urls = ['https://cqranking.com/men/asp/gen/race.asp?raceid=36151', 'https://cqranking.com/men/asp/gen/race.asp?raceid=36151'] # 将整个爬虫逻辑放到with块内,保证writer全程有效 with open('cycling_results.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile, delimiter=';') # 修正表头:添加"赛事标题"列,对应首列的内容 writer.writerow(['赛事标题', 'Start', 'Rank', '', '', 'Name', '', 'Team', '', 'Time', '', 'Points']) # loop through all urls in the array for url in urls: time.sleep(2) response = requests.get(url) data = response.content soup = BeautifulSoup(data, 'html.parser') # 获取并清理赛事标题(去除多余空格和换行) race_title = soup.find('title').get_text().strip() tables = soup.find_all('table') for table in tables: rows = table.find_all('tr') for row in rows: csv_row = [] columns = row.find_all('td') for column in columns: # 清理单元格文本的多余空白 csv_row.append(column.get_text().strip()) # 仅当行有内容时才写入,直接解决空行问题 if csv_row: # 把赛事标题插入到每行的最前面 csv_row.insert(0, race_title) writer.writerow(csv_row)
关键修改点说明
- 调整
writer作用域:把URL循环和数据处理逻辑全部放到with open代码块内,确保文件在整个爬虫过程中保持打开状态,writer可以正常写入。 - 正确获取赛事标题:用
.get_text().strip()获取并清理标题文本,避免多余的空格或换行符干扰CSV格式。 - 标题插入每行数据:在构造好每行的
csv_row后,用insert(0, race_title)把标题放到首列,再写入CSV,完全符合你的需求。 - 提前处理空行:通过
if csv_row:判断,只有当行内容非空时才写入,直接解决了你后续要处理空行的需求。
额外优化提示
- 你当前的
urls列表里两个URL是重复的,记得换成不同的赛事链接哦。 - 可以添加
try-except异常处理,应对网络请求失败、页面结构变化等情况,让爬虫更健壮。
内容的提问来源于stack exchange,提问作者kvndcnnck
相关产品推荐
相关产品推荐

