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

Python解析CoinMarketCap比特币历史数据仅获第一行重复输出问题

问题分析与修复方案

你遇到的问题核心是循环逻辑错误加上每次循环都重复获取全局的td元素,导致始终输出第一行数据。咱们一步步拆解:

1. 循环范围搞错了

你的代码里写了:

for tr in soup.find_all('tr')[6]:

这里soup.find_all('tr')[6]是单个<tr>元素(第7行,因为索引从0开始),循环这个元素的时候,其实是在遍历它的子节点(比如每个<td>或者空白文本节点),而不是遍历你需要的30行历史数据。

正确的做法是遍历从第6个元素开始的所有行(前面的行是表头或无关内容),应该写成:

for tr in soup.find_all('tr')[6:]:

这里的[6:]表示取列表中从索引6到末尾的所有元素,也就是所有历史数据行。

2. 每次循环都全局获取td元素

你在循环里写:

tds = soup.find_all('td')

这会获取页面上所有的<td>元素,所以每次取tds[0]到tds[6]都是第一行的数据,自然重复输出。

正确的做法是针对当前循环的<tr>元素,获取它下面的<td>:

tds = tr.find_all('td')

这样每次循环拿到的都是当前行的td数据。

修正后的完整代码

import requests
from bs4 import BeautifulSoup

url = "https://coinmarketcap.com/currencies/bitcoin/historical-data/"
r = requests.get(url)
html_content = r.text
soup = BeautifulSoup(html_content,"html.parser")

# 遍历从第6行开始的所有数据行
for tr in soup.find_all('tr')[6:]:
    # 获取当前行的所有td
    tds = tr.find_all('td')
    # 确保当前行有足够的td元素(避免索引越界)
    if len(tds) >=7:
        print ("date: %s, Open: %s, High:%s, Low: %s, Close: %s, Volume: %s, Marketcap: %s\n" % \
        (tds[0].text,tds[1].text,tds[2].text,tds[3].text,tds[4].text, tds[5].text, tds[6].text))

我还加了一个if len(tds)>=7的判断,防止某些行没有足够的td导致索引错误,让代码更健壮一些。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:05:51