正则表达式没有返回匹配但显然有匹配

时间:2013-07-19 18:39:08

标签: python html regex

我正在搜索html格式的网站,查找具有以下格式的字符串(“s”):

<td class="number">$0.48</td>

我试图通过使用正则表达式返回“$ 0.48”。它一直工作到今天,我不知道发生了什么变化,但这是我的代码片段:

def scrubdividata(ticker):
    sleep(1.0) # Time in seconds.
    f = urllib2.urlopen('the url')
    lines = f.readlines()
    for i in range(0,len(lines)):
        line = lines[i]
        if "Annual Dividend:" in line:
            print 'for ticker %s, annual dividend is in line'%(ticker)
            s = str(lines[i+1])
            print s
            start = '>$'
            end = '</td>'
            AnnualDiv = re.search('%s(.*)%s' % (start, end), s).group(1)

结果如下:

for ticker A, annual dividend is in line

    <td class="number">$0.48</td>

Traceback (most recent call last):
  File "test.py", line 115, in <module>
    scrubdividata(ticker)
  File "test.py", line 34, in scrubdividata
    LastDiv = re.search('%s(.*)%s' % (start, end), s).group(1)
AttributeError: 'NoneType' object has no attribute 'group'

我正在使用python 2.5(我相信)。我听说永远不会用html使用正则表达式,但我需要快速利用我有限的知识来尽快完成工作,而正则表达式是我所知道的唯一方法。现在,我是在承受后果,还是有另一个问题导致这种情况发生?任何见解都会很精彩!

谢谢,B

2 个答案:

答案 0 :(得分:3)

来自文档:

  

“$”匹配字符串的结尾或刚好在换行符之前          字符串的结尾。

所以你可能想要像这样逃避这条线上的美元符号:

start = '>\$'

如果您考虑将来再进行HTML搜索,我建议您查看Beautiful Soup模块。它比正则表达式更宽容。

答案 1 :(得分:1)

你需要逃脱美元符号。

start = '>\$'
end = '</td>'
AnnualDiv = re.search('%s(.*)%s' % (start, end), s).group(1)

原因是$是正则表达式中的特殊字符。 (它匹配字符串的结尾或换行符之前。)

这会将AnnualDiv设置为字符串'0.48'。如果您想添加$,可以使用以下方法添加:

AnnualDiv = "$%s" % re.search('%s(.*)%s' % (start, end), s).group(1)