在BS4中获取`list`对象没有属性错误

时间:2017-08-29 17:40:41

标签: python beautifulsoup bs4

我是bs4的新手,正在尝试为加密货币构建价格机器人。这是我到目前为止的代码:

import requests
import bs4
import csv
from datetime import datetime

def remove_all_whitespace(x):
    try:
        x = x.replace(" ", "")
    except:
        pass
    return x

def trim_the_ends(x):
    try:
        x = x.strip(' \t\n\r')
    except:
        pass
    return x

def remove_unneeded_chars(x):
    try:
        x = x.replace("$", "").replace("RRP", "")
    except:
        pass
    return x

URL = ("https://coinmarketcap.com/assets/golem-network-tokens/")

response = requests.get(URL)

soup = bs4.BeautifulSoup(response.text)

price = soup.select("span#quote_price.text-large").get_text()

print (price)

但是我收到了这个错误:

AttributeError: 'list' object has no attribute 'get_text'

我做错了什么?根据我的理解,.select不适用于list项,但我如何提取list

1 个答案:

答案 0 :(得分:2)

是的,soup.select() 返回匹配的列表;选择器可以匹配0次或更多次。

如果您只想检索一个匹配,请使用返回第一个匹配项的soup.select_one()方法,如果没有匹配项,请使用None

price = soup.select_one("span#quote_price.text-large").get_text()

但是,您加载的页面不包含该信息。该页面使用Javascript通过AJAX加载数据。 requests不是浏览器,无法加载外部资源或执行Javascript代码。

页面从https://graphs.coinmarketcap.com/currencies/golem-network-tokens/加载价格,然后加载:

>>> import requests
>>> r = requests.get('https://graphs.coinmarketcap.com/currencies/golem-network-tokens/')
>>> data = r.json()
>>> data['price_usd'][-1][1]
0.309104

该列表中每个条目的第一个元素是以微秒为单位的时间戳:

>>> from datetime import datetime
>>> datetime.fromtimestamp(data['price_usd'][-1][0] / 1000)
datetime.datetime(2017, 8, 29, 18, 34, 46)

你应该使用他们的published API来代替:

https://api.coinmarketcap.com/v1/ticker/golem-network-tokens/