2014-08-09 3 views
0

Используется этот учебник, чтобы скоблить цены на акции: https://www.youtube.com/watch?v=f2h41uEi0xUЦены на акции не скребковые с Python

Есть некоторые подобные вопросы, но я хочу знать, как исправить этот текущий код (для учебных целей), где они просто работают.

Web scraping information other than price from Yahoo Finance in Python 3

Using Regex to get multiple data on single line by scraping stocks from yahoo

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

Все работает, но оно не восстанавливает цены с сайта! У меня есть точный код, который у него есть. Я использую Python Launcher (Mac) 2.7 (также попытался 3.4) для запуска программы python.

Вот мой код:

import urllib 
import re 

symbolslist = ["aapl", "spy", "goog", "nflx"] 
i=0 
while i<len(symbolslist): 
    url = "http://finance.yahoo.com/q?s=" +symbolslist[i] +"&q1=1" 
    htmlfile = urllib.urlopen(url) 
    htmltext = htmlfile.read() 
    regex = '<span id ="yfs_l84_'+symbolslist[i] +'">(.+?)</span>' 
    pattern = re.compile(regex) 
    price = re.findall(pattern,htmltext) 
    print "the price of" , symbolslist[i], " is " ,price 
    i+=1 
+2

Если вы собираетесь узнать вас, а может узнать правильный путь, разбор HTML с регулярным выражением не является хорошей идеей –

+1

Вы также можете перемещаться по элементам symbolslist непосредственно, используя диапазон является излишним. 'для i в символьном списке', тогда просто используйте i вместо' symbollist [i] ' –

+0

@PadraicCunningham. В моем ответе были оба из этих точек, lol – heinst

ответ

2
  1. Существует дополнительное пространство после того, как идентификатор в своем регулярном выражении. Правильное регулярное выражение будет: (см. Пример кода ниже).

  2. цена - это список, поэтому для получения цены вам необходимо использовать цену [0].

Пример кода:

>>> regex = '<span id="yfs_l84_"yfs_l84_'+symbolslist[i] +'"">(.+?)</span>' 
>>> pattern = re.compile(regex) 
>>> price = re.findall(pattern, htmltext) 
>>> price 
[u'568.77'] 
>>> price[0] 
u'568.77' 
+0

Пространство - это проблема, не использующая' symbollist [i] ' –

+0

Да, пространство - проблема, а также цена [0]. Я использовал goog вместо symbollist [i], чтобы быстро проверить, работает ли он. –

+0

хорошо, вероятно, лучше использовать код, поскольку ОП должен избегать путаницы –

1

It is never a good idea to parse HTML using regular expression. Я предлагаю использовать анализатор как BeautifulSoup или lxml разобрать для вас. Кроме того, другое изменение, которое я бы сделал, не использует цикл while. Вместо этого используйте цикл for, как и я. Я вижу, что вы определили i и все равно увеличиваете его, поэтому цикл for имеет больше смысла в этом контексте.

Но что касается неправильного выражения выражения, Tamim прав, у вас есть дополнительное пространство в части вашего выражения.

import urllib 
from bs4 import BeautifulSoup 

symbolslist = ["aapl", "spy", "goog", "nflx"] 
for i in range(0, len(symbolslist)): 
    url = "http://finance.yahoo.com/q?s=" +symbolslist[i] +"&q1=1" 
    htmlfile = urllib.urlopen(url) 
    htmltext = htmlfile.read() 
    bs = BeautifulSoup(htmltext) 
    idTag = 'yfs_l84_' + symbolslist[i] 
    price = bs.find('span', {'id': idTag}).text 
    print "the price of" , symbolslist[i], " is " ,price 
Смежные вопросы