基于Beautiful Soup的嵌套FOR循环爬虫写入异常如何修复?
Python爬虫URL内容与存储文件对应写入修复方案
问题根因
你对问题的判断正确,核心错误是两层嵌套循环的逻辑冗余:
外层循环遍历索引创建test{x}.txt文件时,每次创建完新文件后,内层循环都会把全部8个URL依次爬取写入当前打开的文件,最终每个文件都会写入所有URL的爬取结果,不符合单URL对应单文件的需求。同时原代码没有主动关闭文件句柄,还可能存在缓存写入异常的问题。
修复方案
直接用enumerate遍历URL列表,一层循环同时拿到索引和对应URL即可,推荐搭配with上下文管理器自动处理文件关闭,避免资源泄漏。
修复后代码如下:
import requests from bs4 import BeautifulSoup import sys # 注意:你原代码重复定义了urls,手动定义列表和from websites import urls二选一保留即可 urls = ['https://calevip.org/incentive-project/northern-california', 'https://www.slocleanair.org/community/grants/altfuel.php', 'https://www.mcecleanenergy.org/ev-charging/', 'https://www.peninsulacleanenergy.com/ev-charging-incentives/', 'https://www.irs.gov/businesses/plug-in-electric-vehicle-credit-irc-30-and-irc-30d', 'https://afdc.energy.gov/laws/12309', 'https://cleanvehiclerebate.org/eng/fleet', 'https://calevip.org/incentive-project/san-joaquin-valley'] def scrape(): # 同时遍历索引和对应URL,一层循环完成所有操作 for idx, url in enumerate(urls): page = requests.get(url, timeout=30) soup = BeautifulSoup(page.content, "html.parser") results = soup.prettify().encode('cp1252', errors='ignore') # 用with上下文管理器自动处理文件打开、写入、关闭逻辑 with open(f"test{idx}.txt", 'wb') as f: f.write(results) if __name__ == "__main__": scrape()
额外优化提示
- 写入bytes类型的结果时直接用
wb模式打开文件,无需再转str后写入,可避免编码异常 - 给
requests.get添加timeout参数、自定义请求头,可避免请求超时或者被网站反爬拦截
内容的提问来源于stack exchange,提问作者brooklynveezy
相关产品推荐
相关产品推荐

