我试图从这个网站获得各种硬币的价格:https://coinmarketcap.com/ with Python,使用库: BeautifulSoup(bs4)。
下面的For循环对于前十种价格运行得很好,但是代码显示了以下错误:
crypto_name = crypto_box.find('div',class_='sc-16r8icm-0 sc-1teo54s-1 cPNAgw').p.text
AttributeError: 'NoneType' object has no attribute 'p'我已经检查了第十一枚硬币的HTML代码是否改变了,但是没有,它是一样的。
我还试图只为第十一枚硬币运行Python代码,并且运行良好,没有任何问题。
那么,引发这一错误的可能是什么问题呢?
这是Python代码:
from bs4 import BeautifulSoup
import requests
html_text = requests.get('https://coinmarketcap.com/it/').text
soup = BeautifulSoup(html_text, 'lxml')
crypto_body = soup.find('tbody')
crypto_boxs = crypto_body.find_all('tr')
for crypto_box in crypto_boxs:
crypto_name = crypto_box.find('div',class_='sc-16r8icm-0 sc-1teo54s-1 cPNAgw').p.text
crypto_price = crypto_box.find('div',class_='price___3rj7O').a.text
print(f'Crypto Name: {crypto_name}')
print(f'Crypto Price: {crypto_price}')这是每个硬币的HTML代码。特别是,这是第十一枚硬币
<tr>
<td>
<span class="sc-7f3up6-1 dtMKRz">
<span class="icon-Star"></span>
</span></td>
<td style="text-align: left;">
<p color="text2" font-size="0" class="sc-1eb5slv-0 etpvrL">11</p>
</td>
<td style="text-align: left;">
<div display="flex" class="sc-16r8icm-0 bjdvWe">
<a href="/currencies/bitcoin-cash/" class="cmc-link">
<div class="sc-16r8icm-0 sc-1teo54s-0 jDQqmt">
<img class="coin-logo" src="https://s2.coinmarketcap.com/static/img/coins/64x64/1831.png">
<div class="sc-16r8icm-0 sc-1teo54s-1 cPNAgw">
<p font-weight="semibold" color="text" font-size="1" class="sc-1eb5slv-0 iJjGCS">Bitcoin Cash</p>
<div class="sc-1teo54s-2 fZIJcI"><div class="sc-1teo54s-3 etWhyV">11</div>
<p color="text3" class="sc-1eb5slv-0 gGIpIK coin-item-symbol" font-size="1">BCH</p>
</div>
</div>
</div>
</a>
<div class="sc-16r8icm-0 XVjpr">
<div aria-expanded="false">
<div class="sc-1ouqzht-0 dwctMr">
<button class="x0o17e-0 kPvqGV" style="white-space: nowrap;">Buy</button>
</div>
</div>
</div>
</div>
</td>
<td>
<div class="price___3rj7O "><a href="/currencies/bitcoin-cash/markets/" class="cmc-link">$696.51</a>
</div>
</td>
<td style="text-align: right;">
<span class="sc-1v2ivon-0 fJLBDK">
<span class="icon-Caret-up">
</span>12.14%</span>
</td><td style="text-align: right;">
<span class="sc-1v2ivon-0 jvNdfB">
<span class="icon-Caret-down">
</span>38.61%</span>
</td><td style="text-align: right;">
<p color="text" font-size="1" class="sc-1eb5slv-0 kDEzev" style="white-space: nowrap;">
<span class="ggzdxp-0 hWIeFI">$13.48B</span>
<span class="ggzdxp-1 ftvydZ">$13,484,367,596</span>
</p>
</td>
<td style="text-align: right;">
<div class="sc-16r8icm-0 sc-1anvaoh-0 gpGZZK">
<a href="/currencies/bitcoin-cash/markets/" class="cmc-link">
<p font-size="1" class="sc-1eb5slv-0 kDEzev font_weight_500___2Lmmi" color="text">$5,914,262,210</p>
</a>
<p color="text2" font-size="0" class="sc-1eb5slv-0 etpvrL">8,222,076 BCH</p>
</div>
</td>
<td style="text-align: right;">
<div class="sc-16r8icm-0 g5oqcc-0 ebjmWp">
<div class="sc-16r8icm-0 g5oqcc-1 fuJsZs">
<div class="g5oqcc-4 gQCXde">
<span class="icon-Info">
</span>
</div>
<p font-size="1" font-weight="medium" color="text" class="sc-1eb5slv-0 hNpJqV">18,746,125 BCH</p>
</div>
<div width="160" class="qlsl66-0 jrRnei">
<div width="143" class="qlsl66-1 gntYXo">
</div>
</div>
</div>
</td>
<td style="text-align: right;">
<a href="/currencies/bitcoin-cash/" class="cmc-link">
<img src="https://s3.coinmarketcap.com/generated/sparklines/web/7d/usd/1831.png" alt="1831-price-graph" class="tableGraph___c_IY- graphDown___2-1G6">
</a>
</td>
<td>
<div class="sc-16r8icm-0 dOJIkS" aria-expanded="false">
<button class="x0o17e-0 ftvUnY sc-7pvt85-0 hmFKKb">
<span class="icon-More-Vertical"></span></button>
</div>
</td>
</tr>这是运行Python代码后的结果:
Crypto Name: Bitcoin
Crypto Price: €30,557.74
Crypto Name: Ethereum
Crypto Price: €2,030.75
Crypto Name: Tether
Crypto Price: €0.8173
Crypto Name: Binance Coin
Crypto Price: €264.41
Crypto Name: Cardano
Crypto Price: €1.23
Crypto Name: Dogecoin
Crypto Price: €0.275
Crypto Name: XRP
Crypto Price: €0.7661
Crypto Name: USD Coin
Crypto Price: €0.8161
Crypto Name: Polkadot
Crypto Price: €16.89
Crypto Name: Internet Computer
Crypto Price: €106.86
File "/Users/******/*******/*******/*******/main.py", line 10, in <module>
crypto_name = crypto_box.find('div',class_='sc-16r8icm-0 sc-1teo54s-1 cPNAgw').p.text
AttributeError: 'NoneType' object has no attribute 'p'发布于 2021-05-25 13:28:51
crypto_box.find()调用有时无法找到匹配的<div>,因此当您调用.p.text时,它会给出错误。
解决方法是在尝试访问.p.text之前保存查找结果,如下所示:
from bs4 import BeautifulSoup
import requests
html_text = requests.get('https://coinmarketcap.com/it/').text
soup = BeautifulSoup(html_text, 'lxml')
crypto_body = soup.find('tbody')
crypto_boxs = crypto_body.find_all('tr')
for crypto_box in crypto_boxs:
div = crypto_box.find('div',class_='sc-16r8icm-0 sc-1teo54s-1 cPNAgw')
if div:
crypto_name = div.p.text
crypto_price = crypto_box.find('div',class_='price___3rj7O').a.text
print(f'Crypto Name: {crypto_name}')
print(f'Crypto Price: {crypto_price}')给予你:
Crypto Name: Bitcoin
Crypto Price: €30,566.99
Crypto Name: Ethereum
Crypto Price: €2,069.74
Crypto Name: Tether
Crypto Price: €0.8177
Crypto Name: Binance Coin
Crypto Price: €264.73
Crypto Name: Cardano
Crypto Price: €1.22
Crypto Name: Dogecoin
Crypto Price: €0.2812
Crypto Name: XRP
Crypto Price: €0.7606
Crypto Name: USD Coin
Crypto Price: €0.8165
Crypto Name: Polkadot
Crypto Price: €16.94
Crypto Name: Internet Computer
Crypto Price: €110.31您还可以通过其JSON直接访问数据,如下所示:
import requests
url = "https://web-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?id=2781,3526,3537,2821,3527,2782,3528,3531,3530,3533,3532,2832,3529,2783,2814,3549,2784,2786,2787,2820,3534,2815,3535,2788,2789,3536,3538,2790,3539,3540,3541,3542,2792,2793,2818,2796,2794,3544,3543,2795,3545,2797,3546,3551,3547,3550,3548,3552,3556,2800,2816,2799,3555,3558,3554,3557,3559,3561,2811,2802,3560,2819,2801,3562,2804,3563,2822,2803,2805,2791,3564,2817,2806,3566,3565,2808,2812,2798,3567,3573,3553,2807,2785,2809,3569,3568,2810,3570,2824,2813,3571,3572,2823,1,1027,2010,1839,6636,52,1975,2,512,1831,7083,74,9023,9022&convert_id=2781"
req = requests.get(url)
data = req.json()['data']
for symbol in data.values():
price = symbol['quote']['2781']['price']
print(f"{symbol['name']} - {price:.4f}")我建议您使用print(data)来查看实际返回的数据。
https://stackoverflow.com/questions/67687089
复制相似问题