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
相关产品推荐
相关产品推荐

