使用Python 3从雅虎财经网站

时间:2016-05-21 14:02:22

标签: python yahoo-finance

我一直在尝试移植一个脚本,该脚本将从Yahoo Finance网站请求基本数据,但我想查找特定项目而不是整个报告,例如价格与账面比率。所以,我已经按照Sentdex的教程来了解如何做到这一点。问题是示例代码是为Python 2.7编写的,我试图让它适用于Python 3,当然还可以通过添加更多功能来扩展它。

到目前为止,它是如何看待的:

import time
import urllib
import urllib.request


sp500short = ['a', 'aa', 'aapl', 'abbv', 'abc', 'abt', 'ace', 'aci', 'acn', 'act', 'adbe', 'adi', 'adm', 'adp']


def yahooKeyStats(stock):

    try:
        sourceCode = urllib.request.urlopen('http://finance.yahoo.com/q/ks?s='+stock).read()
        pbr = sourceCode.split('Price/Book (mrq):</td><td class="yfnc_tabledata1">')[1].split('</td>')[0]       
        print ('price to book ratio:'),stock,pbr

    except Exception as e:
        print ('failed in the main loop'),str(e)


for eachStock in sp500short:
    yahooKeyStats(eachStock)
    time.sleep(1)

我几乎可以肯定问题是在pbr变量定义上,在它的分裂部分。的:

 Price/Book (mrq):</td><td class="yfnc_tabledata1">

和...

</td>

...只是一种分隔符,正如我所寻找的,实际值,介于上面列出的这两个项目之间。但是,到目前为止它只是在执行它时给我异常消息。

任何帮助将不胜感激。 欢呼声,

1 个答案:

答案 0 :(得分:1)

看起来urllib.request.urlopen.read()正在返回类型为bytes的数据。

来自python docs:

  

请注意,urlopen返回一个bytes对象。这是因为urlopen无法自动确定从http服务器接收的字节流的编码。通常,程序会在确定或猜测适当的编码后将返回的字节对象解码为字符串。

拆分方法在这里失败了。尝试在.decode()之后添加.read()。问题是您尝试将sourceCode类型为bytes的变量拆分为字符串。解码sourceCode会将其从字节转换为字符串。或者,您可以.encode()两个分隔符。

bytes.decode