Openpyxl遍历列异常:A、B列内容重复,如何分别存入币名与交易量?
问题解决:Excel列内容重复&数据爬取错误
问题根源
- 爬取选择器太宽泛:你用
no-wrap类筛选交易量,这个类在页面中被多个元素复用(比如加密货币名称旁的符号、价格等),导致爬取到的volume列表和crypto列表内容重复,最终写入Excel时A、B列内容一致。 - Excel写入逻辑冗余:使用
iter_cols迭代列的写法不够直观,虽然逻辑上没问题,但容易混淆迭代对象。
修正方案
1. 精准定位交易量元素
CoinGecko首页的交易量数据位于表格的「24h Volume」列,通过先定位表格行,再从行内提取对应列的方式,能确保获取到正确的交易量数据。
2. 简化Excel写入逻辑
直接通过行号和列号赋值,代码更清晰易懂,避免迭代列带来的混淆。
修正后的代码
from bs4 import BeautifulSoup as bs import requests from headers import HEADERS from openpyxl import load_workbook # 加载Excel文件 book = load_workbook("Crypto.xlsx") ws = book.active # 请求页面 response = requests.get("https://www.coingecko.com/", headers=HEADERS) soup = bs(response.text, "html.parser") # 爬取加密货币名称和交易量:定位表格行后逐行提取 coin_rows = soup.find_all("tr", class_="coin-row")[:50] crypto = [] volume = [] for row in coin_rows: # 提取加密货币名称 name_elem = row.find("span", class_="lg:tw-flex font-bold tw-items-center tw-justify-between") if name_elem: crypto.append(name_elem.text.replace("\n", "").strip()) # 提取24h交易量 volume_elem = row.find("td", class_="td-liquidity_score").find("span", class_="no-wrap") if volume_elem: volume.append(volume_elem.text.strip()) # 写入A列:加密货币名称 for idx, name in enumerate(crypto, start=1): ws.cell(row=idx, column=1, value=name) # 写入B列:交易量 for idx, vol in enumerate(volume, start=1): ws.cell(row=idx, column=2, value=vol) # 保存文件 book.save("Crypto.xlsx")
代码说明
- 爬取部分:先定位表格的每一行
coin-row,再从每行中分别提取名称和交易量,确保两组数据一一对应,不会出现内容重复。 - 写入Excel部分:用
enumerate(start=1)直接对应Excel的行号(Excel行从1开始),通过column=1和column=2明确指定A、B列,逻辑清晰不易出错。
内容的提问来源于stack exchange,提问作者Marouan H
相关产品推荐
相关产品推荐

