【问题标题】:Web scraping using regex使用正则表达式进行网页抓取
【发布时间】:2017-02-02 03:33:08
【问题描述】:

我不知道为什么这段代码不起作用,甚至认为它与在线教程 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 

预期结果:

112.71

帮助表示赞赏。我尝试在 url 上使用“read()”,但这没有用。根据文档,甚至应该包括空结果。谢谢

【问题讨论】:

  • 你的正则表达式有错误,正确的模式是&lt;span id="ref_[^.]*_l"&gt;(.+?)&lt;\/span&gt;
  • 如果您使用的教程建议使用正则表达式来抓取网页,请另找一个; HTML 解析器的存在是有原因的。
  • @ZdaR 好吧不.../ 不需要在正则表达式中转义...
  • 应避免使用任何告诉您使用正则表达式解析 html 的教程。 Beautifulsoup 可以在一行中可靠地做到这一点BeautifulSoup(htmltext).select("span[id^=ref_]")

标签: python regex web-scraping typeerror


【解决方案1】:

问题是您实际上并没有从请求中读取 HTML。

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

【讨论】:

  • 嗯... OP 说 我尝试在 url 上使用“read()”,但没有用...
  • 他们应该显示该代码;这对我有用。这绝对是 Python 2,因为urllib.urlopen 在 Python 3 中不存在。
  • 对,所以我没有收到任何错误,而只是一个空结果......我不应该这样做,因为该模式在页面中出现了几次。
  • @Smolo,它返回 ['112.71'] 并且有一个匹配模式而不是多个匹配。如果您一无所获,则可能由于各种原因无法获得相同的来源。
  • @PadraicCunningham 我正在通过 Python shell 2.7.6 以及在云中运行的 Python 执行代码(如果两者之间的输出存在任何差异)。这是代码tutorialspoint.com/… 的链接我如何才能更深入地了解为什么我们会得到不同的结果?谢谢!
【解决方案2】:

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

% 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

切勿使用正则表达式进行网页抓取

我对获取最后一个数组元素进行了改进

【讨论】:

  • 谢谢 Gilles,但您打开的网址不同。我确实遵循教程直到最后,但我仍然不明白为什么同一段代码对不同的人/环境有不同的工作方式。我很感激!
  • 这是教程最后使用的网址
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2019-11-28
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多