如何设计我的正则表达式脚本来抓取非常特定的属性,例如颜色?



这个周末我正在练习编写抓取脚本。我的方法是调整我以前使用过的刮板,从抓取股票"价格"到抓取属性:网站中使用的颜色。我已经研究了库和工具,例如lxml和Beautiful soup,并尝试了一些调试,但我不太清楚。

目标: 返回网站上使用的所有颜色的列表

这是我写的:

import urllib
import re
url="https://cloud.google.com/edu"
htmlfile = urllib.urlopen(url)
htmlsource = htmlfile.read()
regex = '<color:#aaa>'
pattern = re.compile(regex)
color = re.findall(pattern, htmlsource)
print "color", color

我不断得到的回报是:颜色

regex = '<color:#aaa>'将捕获看起来与'<color:#aaa>'完全相同的字符串

如果您查看要抓取的页面的源代码(view-source:https://cloud.google.com/edu/),并使用浏览器(ctrl + f)进行搜索,您会注意到字符串'<color:#aaa>'不存在任何地方。

如果要获取该页面上使用的颜色,则必须检索基本上如下所示的样式子字符串:

  1. 颜色:#xxx
  2. 颜色:RGBA(X,X,X,X)

但这些可能会略有不同:

  • 6 位十六进制颜色,而不是 3 位
  • 数字
  • 具有 3 个参数的 RGB 而不是具有 4 个参数的 RGBA
  • "颜色">
  • 不仅被命名为"颜色",而且被命名为"其他颜色">
  • 子字符串内的随机间距

这就是正则表达式派上用场的地方。我们可以制作几个处理这些场景的正则表达式(或者为两者创建一个大的、丑陋的正则表达式)。几个快速、不完整的例子,从我的头顶:

  1. 'color:#(?:d{6}|d{3})'
  2. 'color:rgba?(d+,d+,d+)'

我想你可以从之后的出现中删除子字符串"color:">

最新更新