1

This is the code I am using from Christophers Reeves tutorial on stock scraping it's his 3rd video on the subject on youtube.

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

I get the following error when I run this code in python 2.7.5

Traceback <most recent call last>:
File "fundamentalism)stocks.py, line 12, in <module>
pattern = re.compile(regex)
File "C:\Python27\lib\re.py", line 190, in compile
return _compile(pattern, flags)
File "C:\Python27\lib\re.py, line 242, in compile
raise error, v # invalid expression
sre_constant.error: multiple repeat

I don't know if the problem is with the way my library, is installed, my version of python or what. I appreciate your help.

4

2 回答 2

3

问题在于使用多个重复字符:+?.

可能,非贪婪匹配意味着(.+?)

' *'、' +' 和 ' ?' 限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不希望的;如果 RE<.*>与 ' <H1>title</H1>' 匹配,它将匹配整个字符串,而不仅仅是 ' <H1>'。在限定符之后添加 ' ?' 使其以非贪婪或最小方式执行匹配;将匹配尽可能少的字符。.*?在前面的表达式中使用将只匹配 ' <H1>'..

于 2013-09-02T18:49:20.647 回答
0

其他人已经回答了贪婪匹配,但在一个不相关的注释上,你会想写得更像:

for symbol in symbolslist:
    url = "http://finance.yahoo.com/q?s=%s&q1=1" % symbol
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    regex = '<span id="yfs_l84_%s">(.?+)</span>' % symbol
    price = re.findall(regex, htmltext)[0]
    print "The price of", symbol," is", price
  • 标准的 Python 习惯用法是遍历列表中的所有值,而不是通过索引来挑选它们。
  • “字符串插值”比字符串连接更容易管理,尤其是当您将多个值添加到组合中时(例如,您可能想q1在以后的版本中指定 的值)。
  • re.findall将字符串作为其第一个参数。显式编译一个模式,然后在下一个循环中将其丢弃不会给你任何东西。
  • re.findall返回一个列表,您只需要其中的第一个元素。
于 2013-09-08T00:22:56.003 回答