Использование python и urllib для получения данных из Yahoo FInance

Я использовал urllib в python, чтобы получить цены на акции от 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

Итак, я ввожу значение, и выходит цена акции. Но пока я могу заставить его отображать цену, просто пустой [ ]. Я прокомментировал, где, по моему мнению, проблема. Какие-либо предложения? Спасибо.


person ng150716    schedule 16.04.2014    source источник
comment
Используйте красивый суп для разбора html/xml, а не регулярное выражение.   -  person ajmartin    schedule 16.04.2014
comment
Какое значение вы вводите?   -  person shaktimaan    schedule 16.04.2014


Ответы (4)


Вы не избежали косой черты в своем регулярном выражении. Измените регулярное выражение с:

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

to

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

Это решит вашу проблему, если вы введете код листинга компании в качестве входных данных для своего кода. Бывший; гугл для гугла.

Тем не менее, регулярное выражение - плохой выбор для того, что вы пытаетесь сделать. По совету других, изучите BeautifulSoup, библиотеку Python для извлечения данных. HTML. С 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
person shaktimaan    schedule 16.04.2014

По какой причине вы не можете использовать панд? Он имеет хорошую поддержку для очистки финансовых данных и анализа временных рядов.

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

Вот пример Yahoo прямо из документации:

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
person dranxo    schedule 16.04.2014

Это руководство покажет вам, как создавать финансовые запросы Yahoo, которые будут возвращать файлы csv. Затем вы можете использовать библиотеку csv, чтобы легко их анализировать.

Если вы действительно хотите попробовать взломать HTML, используйте BeautifulSoup. HTML не может быть легко проанализирован с помощью регулярных выражений.

person dmcauslan    schedule 16.04.2014

Лучший способ получить данные из Yahoo Finance с помощью python2 или python3 — использовать метод POST.
Вы можете легко проверить это с помощью службы Rest, такой как Postman.

Откройте почтальон и используйте метод 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, но теперь он выдает ошибку авторизации. Вероятно, они фильтруют все с помощью методов Rest, таких как GET и POST.

person Spencer Davis    schedule 29.03.2018