2016-09-24 79 views
-3

为什么这段代码无法正常工作,我甚至认为它和在线教程Python Web Scraping Tutorial 5 (Network Requests)的代码一样。我试着通过在线Python解释器来运行代码。使用正则表达式的网页抓取

import urllib 
import re 

htmltext = urllib.urlopen("https://www.google.com/finance?q=AAPL") 

regex = '<span id="ref_[^.]*_l">(.+?)</span>' 
pattern = re.compile(regex) 
results = re.findall(pattern,htmltext) 
results 

我得到:

re.pyc in findall(pattern, string, flags) 
175 
176  Empty matches are included in the result.""" 
--> 177  return _compile(pattern, flags).findall(string) 
178 
179 if sys.hexversion >= 0x02020000: 

TypeError: expected string or buffer 

预期结果(S):

112.71 

帮助表示赞赏。我尝试使用“读取()”的网址,但没有奏效。根据文件,甚至应包括空的结果。谢谢

+0

有错误在您的正则表达式模式中,正确的模式将是'(。+?)<\/span>' – ZdaR

+4

如果您正在使用的教程建议使用正则表达式来刮取网页,找到一个不同的;存在HTML解析器是有原因的。 – jonrsharpe

+0

@ZdaR好吧...'/'不需要在正则表达式中转义... –

回答

0

问题是你没有真正从请求中读取HTML。

htmltext = urllib.urlopen("https://www.google.com/finance?q=AAPL").read() 
+0

嗯...该OP说*我试图使用“读()”的网址,但没有工作* ... –

+1

那么他们应该显示该代码;这对我有用。这绝对是Python 2,因为在Python 3中不存在'urllib.urlopen'。 –

+0

没错,所以我没有收到任何错误,只是一个空的结果......我不该因为模式在页面内发生几次。 – Smolo

0

如果按照教程,直到最后:):

% python2                          
>>> import urllib 
>>> data = urllib.urlopen('https://www.google.com/finance/getprices?q=AAPL&x=NASD&i=10&p=25m&f=c&auto=1').read() 
>>> print data.split()[-1] 
112.71 

切勿使用正则表达式来网络刮

我做出改进,以最后一个数组元素提取简单

+0

感谢吉尔,但那是你打开的另一个网址。我一直遵循教程,直到最后,但我仍然不明白为什么同一段代码对不同的人/环境有不同的作用。我很欣赏寿! – Smolo

+0

这是本教程结束时使用的URL –