使用Python+BeautifulSoup爬取网页数据,CSV仅写入最后一行问题求助
解决CSV只写入最后一行的问题
嘿,我一眼就瞅出问题所在啦!你现在的代码里,四个独立的for循环会把dname、dadres这些变量一次次覆盖——每次循环到下一个经销商,变量就会被更新成当前经销商的信息,等所有循环结束,这些变量里就只剩下最后一个经销商的数据了,所以写入CSV的时候自然只有最后一行咯。
修正思路
我们需要把四个循环合并成一个,遍历每个经销商节点时,一次性提取该经销商的所有信息,然后把这些信息收集起来或者直接写入CSV,这样就能保证每条数据都被保存下来。
修正后的代码(两种可选方式)
方式一:先收集所有数据再批量写入
import csv import urllib.request from bs4 import BeautifulSoup # 指定目标URL quote_page = "https://www.cardekho.com/Hyundai/Gurgaon/cardealers" page = urllib.request.urlopen(quote_page) # 解析HTML soup = BeautifulSoup(page, "lxml") # 获取所有经销商的节点 delrname = soup.find_all('div', class_='deleadres') # 初始化列表存储所有经销商数据 dealer_data = [] for dealer in delrname: # 提取当前经销商的所有信息,用strip()清理多余空格换行 dname = dealer.find('div', class_="delrname").text.strip() dadres = dealer.find('p').text.strip() dmobile = dealer.find('div', class_="clearfix").text.strip() demail = dealer.find('div', class_="mobno").text.strip() # 打印验证每条数据 print(f"经销商:{dname}\n地址:{dadres}\n电话:{dmobile}\n邮箱:{demail}\n") # 将当前经销商数据加入列表 dealer_data.append([dname, dadres, dmobile, demail]) # 写入CSV文件 with open('result.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['NAME', 'ADDRESS', 'MOBILE', 'EMAIL']) # 批量写入所有经销商数据 writer.writerows(dealer_data)
方式二:遍历过程中直接写入每条数据
这种方式不需要提前收集所有数据,节省内存(数据量小时差异不大):
import csv import urllib.request from bs4 import BeautifulSoup quote_page = "https://www.cardekho.com/Hyundai/Gurgaon/cardealers" page = urllib.request.urlopen(quote_page) soup = BeautifulSoup(page, "lxml") delrname = soup.find_all('div', class_='deleadres') # 打开CSV文件,直接在循环中写入数据 with open('result.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['NAME', 'ADDRESS', 'MOBILE', 'EMAIL']) for dealer in delrname: dname = dealer.find('div', class_="delrname").text.strip() dadres = dealer.find('p').text.strip() dmobile = dealer.find('div', class_="clearfix").text.strip() demail = dealer.find('div', class_="mobno").text.strip() print(f"经销商:{dname}\n地址:{dadres}\n电话:{dmobile}\n邮箱:{demail}\n") # 写入当前经销商的数据 writer.writerow([dname, dadres, dmobile, demail])
关键修改点说明
- 合并循环:把四个独立的循环整合成一个,确保每次处理单个经销商的完整信息,避免变量被覆盖。
- 清理文本:使用
strip()方法去除文本前后的空格、换行符,让CSV内容更整洁。 - 编码设置:添加
encoding='utf-8'参数,避免写入中文时出现乱码问题。 - 批量/逐行写入:两种写入方式都能保证所有数据被保存,按需选择即可。
内容的提问来源于stack exchange,提问作者Raushan Singh
相关产品推荐
相关产品推荐

