为什么我的程序不打印我正在抓取的 table 中的数据?
Why is my program not printing data from the table I am scraping?
我目前正在努力创建一个从 https://coinmarketcap.com 上的 table 抓取数据的程序。我看到我有点不知所措。但是,我正在努力学习这一切是如何工作的,以便能够自己完成。到目前为止,我的程序打印了加密货币等级、名称和股票代码。现在,我正在努力从 table 中抓取动态变化的价格。这是我的代码:
import requests
from bs4 import BeautifulSoup
url = "https://coinmarketcap.com"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
rank = 1
for td in soup.select("td:nth-of-type(3)"):
t = " ".join(tag.text for tag in td.select("p, span")).strip()
print(rank, "|", end =" "); print("{:<30} {:<10}".format(*t.rsplit(maxsplit=1)))
rank = rank + 1
for td in soup.select("td:nth-of-type(4)"):
t = " ".join(tag.text for tag in td.select("a")).strip()
print("{}_1d".format(t.rsplit(maxsplit=1)))
打印如下:
1 | Bitcoin BTC
[]_1d
2 | Ethereum ETH
[]_1d
3 | Tether USDT
[]_1d
4 | Binance Coin BNB
[]_1d
and so on...
我如何让它打印加密货币的当前价格而不仅仅是文字?我可以自己弄清楚格式,只需要显示实际数据的帮助。任何帮助是极大的赞赏。如果您能解释您的解决方案,那将更有帮助。
我在您的代码中发现了以下问题:
- 您的行
print("{}_1d".format(t.rsplit(maxsplit=1)))
位于内部 for 循环之外,这使得只打印 t
的最后一个值(为空)。
因此,需要更正它以将其放入循环中,同时更改为不打印每个 t
值。
- 您已将价格循环 (td:nth-of-type(4)) 放入 td:nth-of-type(3) 循环中。这使得整个价格循环 运行 重复每次外循环 运行 一次
- 如果您在循环中使用 (td:nth-of-type(4)) 打印 td 的值,您会发现在前 ~10 个结果后,该标签不存在于您的响应中。使用 td.text 将为您提供所需的结果。
我稍微修改了您的代码以解决一些问题:
import requests
from bs4 import BeautifulSoup
url = "https://coinmarketcap.com"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
rank = 1
t1, t2 = [], []
for td in soup.select("td:nth-of-type(3)"):
t1.append(" ".join(tag.text for tag in td.select("p, span")).strip())
for td in soup.select("td:nth-of-type(4)"):
t2.append(td.text)
for i in range(0, len(t1)):
rank = rank + 1
print(rank, "|", end =" "); print("{:<30} {:<10}".format(*t1[i].rsplit(maxsplit=1)))
print("{}_1d".format(t2[i]))
要获取加密货币的价格,您可以使用下一个示例:
import requests
from bs4 import BeautifulSoup
url = "https://coinmarketcap.com"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
for rank, td in enumerate(soup.select("td:nth-of-type(3)"), 1):
t = " ".join(tag.text for tag in td.select("p, span")).strip()
price = td.find_next("td").text
print(
"{:<3} | {:<30} {:<10} {:<10}".format(
rank, *t.rsplit(maxsplit=1), price
)
)
打印:
1 | Bitcoin BTC ,971.37
2 | Ethereum ETH ,320.27
3 | Tether USDT .00
4 | Binance Coin BNB 4.10
5 | Cardano ADA .28
6 | XRP XRP [=11=].7078
7 | USD Coin USDC .00
8 | Dogecoin DOGE [=11=].2043
9 | Polkadot DOT .11
10 | Binance USD BUSD .00
11 | Uniswap UNI .24
12 | Bitcoin Cash BCH 7.07
13 | Litecoin LTC 0.07
14 | Chainlink LINK .02
15 | Solana SOL .55
16 | Wrapped Bitcoin WBTC 923.81
17 | Polygon MATIC .02
18 | Stellar XLM [=11=].27
19 | Ethereum Classic ETC .75
20 | THETA THETA .99
...and so on.
我目前正在努力创建一个从 https://coinmarketcap.com 上的 table 抓取数据的程序。我看到我有点不知所措。但是,我正在努力学习这一切是如何工作的,以便能够自己完成。到目前为止,我的程序打印了加密货币等级、名称和股票代码。现在,我正在努力从 table 中抓取动态变化的价格。这是我的代码:
import requests
from bs4 import BeautifulSoup
url = "https://coinmarketcap.com"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
rank = 1
for td in soup.select("td:nth-of-type(3)"):
t = " ".join(tag.text for tag in td.select("p, span")).strip()
print(rank, "|", end =" "); print("{:<30} {:<10}".format(*t.rsplit(maxsplit=1)))
rank = rank + 1
for td in soup.select("td:nth-of-type(4)"):
t = " ".join(tag.text for tag in td.select("a")).strip()
print("{}_1d".format(t.rsplit(maxsplit=1)))
打印如下:
1 | Bitcoin BTC
[]_1d
2 | Ethereum ETH
[]_1d
3 | Tether USDT
[]_1d
4 | Binance Coin BNB
[]_1d
and so on...
我如何让它打印加密货币的当前价格而不仅仅是文字?我可以自己弄清楚格式,只需要显示实际数据的帮助。任何帮助是极大的赞赏。如果您能解释您的解决方案,那将更有帮助。
我在您的代码中发现了以下问题:
- 您的行
print("{}_1d".format(t.rsplit(maxsplit=1)))
位于内部 for 循环之外,这使得只打印t
的最后一个值(为空)。 因此,需要更正它以将其放入循环中,同时更改为不打印每个t
值。 - 您已将价格循环 (td:nth-of-type(4)) 放入 td:nth-of-type(3) 循环中。这使得整个价格循环 运行 重复每次外循环 运行 一次
- 如果您在循环中使用 (td:nth-of-type(4)) 打印 td 的值,您会发现在前 ~10 个结果后,该标签不存在于您的响应中。使用 td.text 将为您提供所需的结果。
我稍微修改了您的代码以解决一些问题:
import requests
from bs4 import BeautifulSoup
url = "https://coinmarketcap.com"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
rank = 1
t1, t2 = [], []
for td in soup.select("td:nth-of-type(3)"):
t1.append(" ".join(tag.text for tag in td.select("p, span")).strip())
for td in soup.select("td:nth-of-type(4)"):
t2.append(td.text)
for i in range(0, len(t1)):
rank = rank + 1
print(rank, "|", end =" "); print("{:<30} {:<10}".format(*t1[i].rsplit(maxsplit=1)))
print("{}_1d".format(t2[i]))
要获取加密货币的价格,您可以使用下一个示例:
import requests
from bs4 import BeautifulSoup
url = "https://coinmarketcap.com"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
for rank, td in enumerate(soup.select("td:nth-of-type(3)"), 1):
t = " ".join(tag.text for tag in td.select("p, span")).strip()
price = td.find_next("td").text
print(
"{:<3} | {:<30} {:<10} {:<10}".format(
rank, *t.rsplit(maxsplit=1), price
)
)
打印:
1 | Bitcoin BTC ,971.37
2 | Ethereum ETH ,320.27
3 | Tether USDT .00
4 | Binance Coin BNB 4.10
5 | Cardano ADA .28
6 | XRP XRP [=11=].7078
7 | USD Coin USDC .00
8 | Dogecoin DOGE [=11=].2043
9 | Polkadot DOT .11
10 | Binance USD BUSD .00
11 | Uniswap UNI .24
12 | Bitcoin Cash BCH 7.07
13 | Litecoin LTC 0.07
14 | Chainlink LINK .02
15 | Solana SOL .55
16 | Wrapped Bitcoin WBTC 923.81
17 | Polygon MATIC .02
18 | Stellar XLM [=11=].27
19 | Ethereum Classic ETC .75
20 | THETA THETA .99
...and so on.