【问题标题】:Bokeh Error thrown from periodic callback周期性回调引发的散景错误
【发布时间】:2017-09-21 08:57:20
【问题描述】:

我正在关注关于 Bokeh 的 Udemy 教程,但我遇到了一个错误,我不知道如何解决,也没有收到导师的回复。最初,我认为我的代码有问题,所以花了大约一周的时间试图弄清楚,最后屈服并复制了导师的代码,却发现错误仍然存​​在。

代码的目的是抓取和绘制实时数据。代码如下:

from bokeh.io import curdoc
from bokeh.models import ColumnDataSource, DatetimeTickFormatter
from bokeh.plotting import figure
from random import randrange
import requests
from bs4 import BeautifulSoup

# Create the figure
f = figure()

# Create webscraping function
def extract_value():
    r = requests.get("https://bitcoincharts.com/markets/okcoinUSD.html", headers = {'User-Agent' : 'Chrome'})
    c = r.content
    soup = BeautifulSoup(c, "html.parser")
    value_raw = soup.find_all("p")
    value_net = float(value_raw[0].span.text)
    return value_net

# Create ColumnDataSource
source = ColumnDataSource(dict(x = [], y = []))

# Create glyphs
f.circle(x = 'x', y = 'y', color = 'olive', line_color = 'brown', source = source)
f.line(x = 'x', y = 'y', source = source)

# Create periodic funtion
def update():
    new_data = dict(x = [source.data['x'][-1]+1], y = [extract_value])
    source.stream(new_data, rollover = 200)
    print(source.data) # Displayed in the commmand line!

# Add a figure to curdoc and configure callback
curdoc().add_root(f)
curdoc().add_periodic_callback(update, 2000)

哪个是扔的:

周期性回调抛出的错误:IndexError('list index out of 范围',)

对这里发生的事情有任何想法吗?

【问题讨论】:

  • 我遵循相同的教程,它使用的是旧版本的散景。在此期间,语法可能已更改。从这个角度来看,散景非常“动态”。我看到最新的 BeautifulSoup 和 Bokeh 由于 BeSoup (_html5lib.py) 中的错误而无法正常工作。你现在用的是哪个版本?您是否尝试安装讲师使用的那个?哪一行出现错误?

标签: python python-3.x web-scraping bokeh


【解决方案1】:

像这样改变你的更新功能:

# Create periodic funtion
def update():
    if len(source.data['x']) == 0:
        x = 0
    else:
        x = source.data['x'][-1]+1

    new_data = dict(x = [x] , y = [extract_value()])
    print("new_data", new_data)
    source.stream(new_data, rollover = 200)
    print(source.data) # Displayed in the commmand line!

您的代码有两个问题:

  1. 您不必调用 extract_value 函数,而只需将其分配给y。因此,y 将不包含返回值。
  2. source.data['x'] 在第一次调用 update() 时是一个空列表。因此,您尝试访问空列表的最后一个元素(通过 [-1])。这会给你错误 IndexError('list index out of range')

1 的解决方案是微不足道的。对于 2,它与您之前尝试做的类似。但首先你检查 source.data['x'] 是否为空。这将是第一次调用更新时的情况。在那里,您将 x 设置为 0。在接下来的执行中,当列表非空时,您获取列表中的最后一个值并将其加一。

【讨论】:

  • 谢谢你,很好的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多