我试图从bitcoinbase刮掉比特币的价格,并且找不到正确的语法。当我运行程序时(没有带问号的行),我得到了所需的html块,但我不知道如何缩小范围并获取价格本身。任何帮助表示赞赏,谢谢。
import requests
from bs4 import BeautifulSoup
url = 'https://www.coinbase.com/charts'
data = requests.get(url)
nicedata = data.text
soup = BeautifulSoup(nicedata, 'html.parser')
prettysoup = soup.prettify()
bitcoin = soup.find('h4', {'class':
'Header__StyledHeader-sc-1q6y56a-0 hZxUBM
TextElement__Spacer-sc-18l8wi5-0 hpeTzd'})
price = bitcoin.find('???')
print(price)
The attached image contains the html
最佳答案
要从项目获取文本:
price = bitcoin.text
但是此页面上有许多此类的商品
<h4>
,但是find()
仅获得第一个商品,并且文本为Bitcoin
,而不是图像价格。您可能需要find_all()
来获取所有项目的列表,然后可以使用索引[index]
或切片[start:end]
来获得一些项目,或者可以使用for
循环处理列表中的每个项目。import requests
from bs4 import BeautifulSoup
url = 'https://www.coinbase.com/charts'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
all_h4 = soup.find_all('h4', {'class': 'Header__StyledHeader-sc-1q6y56a-0 hZxUBM TextElement__Spacer-sc-18l8wi5-0 hpeTzd'})
for h4 in all_h4:
print(h4.text)
如果将数据保留在列表或数组或DataFrame的列表中,则可以更轻松地处理数据。但是要创建列表列表,找到行
<tr>
以及在每行搜索<h4>
内会更容易。import requests
from bs4 import BeautifulSoup
url = 'https://www.coinbase.com/charts'
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
all_tr = soup.find_all('tr')
data = []
for tr in all_tr:
row = []
for h4 in tr.find_all('h4'):
row.append(h4.text)
if row: # skip empty row
data.append(row)
for row in data:
print(row)
不需要
class
即可获取全部h4
。顺便说一句:滚动页面时,此页面使用
JavaScript
追加新行,但requests
和BeautifulSoup
无法运行JavaScript
-因此,如果需要所有行,则可能需要Selenium
来控制Web浏览器运行JavaScript
关于python - bs4中.find()的正确语法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59132449/