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

Openpyxl遍历列异常:A、B列内容重复,如何分别存入币名与交易量?

问题解决:Excel列内容重复&数据爬取错误

问题根源

  1. 爬取选择器太宽泛:你用no-wrap类筛选交易量,这个类在页面中被多个元素复用(比如加密货币名称旁的符号、价格等),导致爬取到的volume列表和crypto列表内容重复,最终写入Excel时A、B列内容一致。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:05:43