【问题标题】:Using python and urllib to get data from Yahoo FInance使用 python 和 urllib 从 Yahoo FInance 获取数据
【发布时间】:2014-04-16 04:04:22
【问题描述】:

我在 python 中使用 urllib 从 yahoo Finance 获取股票价格。到目前为止,这是我的代码:

import urllib
import re

name = raw_input(">")

htmlfile = urllib.urlopen("http://finance.yahoo.com/q?s=%s" % name)

htmltext = htmlfile.read()

# The problemed area 
regex = '<span id="yfs_l84_%s">(.+?)</span>' % name

pattern = re.compile(regex)

price = re.findall(pattern, htmltext)

print price

所以我输入一个值,然后股票价格就出来了。但到目前为止,我可以让它显示价格,只是一个空白 []。我已经评论了我认为问题出在哪里。有什么建议么?谢谢。

【问题讨论】:

  • 使用 beautiful soup 解析 html/xml 而不是正则表达式。
  • 你输入的是什么值?

标签: python urllib stock


【解决方案1】:

您没有在正则表达式中转义正斜杠。更改您的正则表达式:

<span id="yfs_l84_%s">(.+?)</span>

到

<span id="yfs_l84_goog">(.+?)<\/span>

假设您输入公司的上市代码作为代码的输入,这将解决您的问题。前任;谷歌的谷歌。

也就是说,正则表达式对于您正在尝试做的事情来说是一个糟糕的选择。正如其他人建议的那样,探索BeautifulSoup,这是一个用于从 HTML 中提取数据的 Python 库。使用 BeautifulSoup,您的代码可以很简单:

from bs4 import BeautifulSoup
import requests

name = raw_input('>')
url = 'http://finance.yahoo.com/q?s={}'.format(name)
r = requests.get(url)
soup = BeautifulSoup(r.text)
data = soup.find('span', attrs={'id':'yfs_l84_'.format(name)})
print data.text

【讨论】:

    【解决方案2】:

    有什么理由不能使用 pandas?它对财务数据抓取和时间序列分析有很好的支持。

    http://pandas.pydata.org/pandas-docs/stable/remote_data.html

    这是直接来自文档的雅虎示例:

    In [1]: import pandas.io.data as web
    In [2]: import datetime
    In [3]: start = datetime.datetime(2010, 1, 1)
    In [4]: end = datetime.datetime(2013, 01, 27)
    In [5]: f=web.DataReader("F", 'yahoo', start, end)
    In [6]: f.ix['2010-01-04']
    Out[6]: 
    OnOpen               10.17
    High               10.28
    Low                10.05
    Close              10.28
    Volume       60855800.00
    Adj Close           9.75
    Name: 2010-01-04 00:00:00, dtype: float64
    

    【讨论】:

      【解决方案3】:

      使用 python2 或 python3 从 Yahoo Finance 获取数据的最佳方法是使用 POST 方法。
      您可以使用 Postman 等 Rest 服务轻松测试这一点

      打开邮递员并使用方法POST并使用它 然后你会看到数据。只需在 python 中重新创建它

      import requests
      url="https://query1.finance.yahoo.com/v7/finance/download/GOOG? period1=1519938930&period2=1522354530&interval=1d&events=history&crumb=.tLvYBkGDu3"
      
      response = requests.post(url)
      print response.text
      

      我曾经使用 urllib2 获取数据,但现在它给出了授权错误 他们可能正在通过 GET 和 POST 等 Rest 方法过滤所有内容

      【讨论】:

        【解决方案4】:

        This guide 将向您展示如何构建将返回 csvs 的 Yahoo 财务查询。然后你可以使用csv库来轻松解析它们。

        如果您真的想尝试破解 HTML,请使用 BeautifulSoup。使用正则表达式无法轻松解析 HTML。

        【讨论】:

          猜你喜欢
          • 2021-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多