爬取汇率数据生成DataFrame导出CSV时如何避免重复行?
解决Python导出美元汇率CSV时的重复行问题
问题根源
你代码里的for row in soup是遍历BeautifulSoup解析后的所有DOM元素,每次循环都把同一个汇率和涨跌幅数据添加到列表里,自然会生成大量重复行(所有行内容完全一致)。
直接避免重复的修改方案
不需要遍历soup,因为你已经提取到了唯一的汇率和涨跌幅值,直接构造单条数据即可:
import requests from bs4 import BeautifulSoup import pandas as pd url = 'https://www.cnbc.com/quotes/.DXY' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') valores = soup.find('div', class_='QuoteStrip-lastPriceStripContainer') cotacao = valores.find('span') variacoes = soup.find('span', class_='QuoteStrip-changeDown') variacao = variacoes.find('span') print(cotacao.text) print(variacao.text) # 直接构造单条数据,无需循环 cotacao_dolar = [{ 'Cambio': cotacao.text, 'Variacao': variacao.text }] df = pd.DataFrame(cotacao_dolar) df.to_csv(r'C:\teste\cotacao_dolar.csv', index=False) # 加上index=False避免导出不必要的索引列
额外优化建议
- 添加
index=False参数,避免CSV中多出无意义的索引列 - 增加异常处理并兼容涨跌两种状态(涨跌幅元素的class会随涨跌变化):
# 优化后的异常处理与多状态兼容 try: valores = soup.find('div', class_='QuoteStrip-lastPriceStripContainer') cotacao = valores.find('span').text if valores else 'N/A' # 同时查找下跌和上涨的class variacoes = soup.find('span', class_='QuoteStrip-changeDown') or soup.find('span', class_='QuoteStrip-changeUp') variacao = variacoes.find('span').text if variacoes else 'N/A' except Exception as e: print(f"提取数据出错: {e}") cotacao = 'N/A' variacao = 'N/A'
内容的提问来源于stack exchange,提问作者Joao Coelho
相关产品推荐
相关产品推荐

