我试图从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追加新行,但requestsBeautifulSoup无法运行JavaScript-因此,如果需要所有行,则可能需要Selenium来控制Web浏览器运行JavaScript

关于python - bs4中.find()的正确语法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59132449/

10-12 00:31
查看更多