我在python中使用urllib从雅虎财务中获取股票价格。到目前为止,这是我的代码:
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
所以我输入一个值,股票价格就出来了。但到目前为止,我可以让它显示价格,只是一个空白[]。我已经评论了我认为问题所在。有什么建议?谢谢。
答案 0 :(得分:4)
你还没有逃过正则表达式中的正斜杠。改变你的正则表达式:
<span id="yfs_l84_%s">(.+?)</span>
到
<span id="yfs_l84_goog">(.+?)<\/span>
如果您输入公司的列表代码作为代码的输入,这将解决您的问题。防爆; google for google。
也就是说,正则表达式对于你想要做的事情来说是一个糟糕的选择。正如其他人所建议的那样,探索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
答案 1 :(得分:1)
你有什么理由不能使用熊猫?它对财务数据抓取和时间序列分析有很好的支持。
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
答案 2 :(得分:0)
This guide将向您展示如何构建将返回csvs的Yahoo财务查询。然后,您可以使用csv
库轻松解析它们。
如果您真的想尝试黑客攻击HTML,请使用BeautifulSoup。使用正则表达式无法轻松解析HTML。
答案 3 :(得分:0)
使用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方法过滤所有内容