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

使用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])

关键修改点说明

  1. 合并循环:把四个独立的循环整合成一个,确保每次处理单个经销商的完整信息,避免变量被覆盖。
  2. 清理文本:使用strip()方法去除文本前后的空格、换行符,让CSV内容更整洁。
  3. 编码设置:添加encoding='utf-8'参数,避免写入中文时出现乱码问题。
  4. 批量/逐行写入:两种写入方式都能保证所有数据被保存,按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:26