Скриптовый скрипт Python не возвращает данные о ценах?

Поэтому я работал над простым сценарием, который извлекает биржевые символы из файла.txt в главном каталоге проектов, и я просто не могу предположить, что он возвращает данные о ценах. Это работает, если я вручную ввожу их в массив строк, но когда дело доходит до извлечения из файла, я просто не хочу возвращать цены.

import urllib
import re

symbolfile = open("symbols.txt")
symbolslist = symbolfile.read()
newsymbolslist = symbolslist.split("\n")

i = 0

while i<len(newsymbollist):
    url = "http://finance.yahoo.com/q?uhb=uh3_finance_vert_gs_ctrl1&fr=&type=2button&s=" +symbolslist[i] +""
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    regex = '<span id="yfs_184_' +newsymbolslist[i] +'">(.+?)</span>'
    pattern = re.compile(regex)
    price = re.findall(pattern,htmltext)
    print "The price of", newsymbolslist[i] ," is ", price
    i+=1

Я мог бы действительно использовать некоторую помощь, потому что она не дает никаких ошибок в оболочке относительно того, почему.

Заранее благодарю за любую помощь!

1 ответ

Внедрив модификацию, представленную @Linus Gustav Larsson Thiel в комментариях и еще одну, касающуюся regex Ваш код возвращает правильные результаты. Пожалуйста, обратите внимание lowercase() в регулярном выражении, поскольку источник содержит строчные символы:

i = 0

while i < len(newsymbolslist):
    url = "http://finance.yahoo.com/q?uhb=uh3_finance_vert_gs_ctrl1&fr=&type=2button&s=" +newsymbolslist[i]
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    regex = '<span id="yfs_l84_' +newsymbolslist[i].lower() +'">(.+?)</span>'
    pattern = re.compile(regex)
    price = pattern.findall(htmltext)
    print "The price of", newsymbolslist[i] ," is ", price
    i+=1

Со статическим списком для целей тестирования ['AAPL','GOOGL','MSFT'] Я получаю следующий вывод:

The price of AAPL  is  ['98.53']
The price of GOOGL  is  ['733.07']
The price of MSFT  is  ['52.30']

Если вы хотите, вы также можете упростить свой код:

baseurl = "http://finance.yahoo.com/q?uhb=uh3_finance_vert_gs_ctrl1&fr=&type=2button&s="

for symbol in newsymbolslist:
    url = baseurl + symbol
    source = urllib.urlopen(url).read()
    regex = re.compile('<span id="yfs_l84_' + symbol.lower() + '">(.+?)</span>')
    price = regex.findall(source)[0]
    print "The price of", symbol, "is", price

for ... in ... цикл устраняет необходимость в переменной счетчика и, так как findall() возвращает список совпадений (пока вы ожидаете только одно), которое вы можете прикрепить [0] отображать содержащую строку, а не список с одним элементом.

Это вернет следующее:

The price of AAPL is 98.53
The price of GOOGL is 733.07
The price of MSFT is 52.30
Другие вопросы по тегам