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

Python BeautifulSoup多页爬虫仅写入最后一页数据到CSV如何解决

问题原因

该问题是变量覆盖+写入逻辑位置错误导致的:

  • 遍历URL的循环中,table_data变量每次都会被新页面的表格内容覆盖,整个循环结束后table_data里仅保留了最后一页的表格数据
  • CSV写入逻辑放在了URL循环的外面,只会执行一次,自然只能写入最后一页的内容
  • 额外的无效代码:循环里第一行的requests.get(url)没有赋值,属于重复发的无效请求,浪费请求资源
修复方案

这里提供两种常用修复方式,按需选择即可:

方式1:逐页写入(适合数据量较大的场景,不用占用内存存储全量数据)

import requests
from csv import writer
from bs4 import BeautifulSoup

urls = ['https://www.xxxxxxxxxxxxxxx/02-nb.php','https://www.xxxxxxxxxxxxxxx/03-np.php','https://www.xxxxxxxxxxxxxxx/04-nb.php']

# 提前打开CSV文件,避免重复开闭文件损耗性能
with open("words.csv", "wt",newline='',encoding='utf-8') as csv_file:
    csv_data = writer(csv_file, delimiter =',')
    for index,url in enumerate(urls):
        page = requests.get(url)
        soup = BeautifulSoup(page.text, 'lxml')
        print(soup)
        table_data = soup.find('table')
        # 直接写入当前页的表格内容
        for voc in table_data.find_all('tr'):
            row_data = voc.find_all('td')
            row = [tr.text for tr in row_data]
            csv_data.writerow(row)

方式2:先收集所有数据再统一写入(适合小数据量场景,方便提前做数据清洗)

import requests
from csv import writer
from bs4 import BeautifulSoup

urls = ['https://www.xxxxxxxxxxxxxxx/02-nb.php','https://www.xxxxxxxxxxxxxxx/03-np.php','https://www.xxxxxxxxxxxxxxx/04-nb.php']
all_rows = [] # 公共列表存储所有页面的行数据

for index,url in enumerate(urls):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'lxml')
    print(soup)
    table_data = soup.find('table')
    for voc in table_data.find_all('tr'):
        row_data = voc.find_all('td')
        row = [tr.text for tr in row_data]
        all_rows.append(row) # 把当前页的行存入公共列表

# 所有页面遍历完成后统一写入文件
with open("words.csv", "wt",newline='',encoding='utf-8') as csv_file:
    csv_data = writer(csv_file, delimiter =',')
    csv_data.writerows(all_rows)
可选优化

如果每个页面的表格都带有重复表头,只想保留第一个表头,可以在循环里加判断跳过后续页面的表头:

for index,url in enumerate(urls):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'lxml')
    table_data = soup.find('table')
    trs = table_data.find_all('tr')
    if index != 0: # 非第一个页面就跳过第一行表头
        trs = trs[1:]
    for voc in trs:
        row_data = voc.find_all('td')
        row = [tr.text for tr in row_data]
        csv_data.writerow(row)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:30:03