为什么我的程序不打印我正在抓取的 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.