正则表达式帮助 - python - 从css中提取所有图像URL

时间:2012-09-21 16:25:09

标签: python regex python-2.7

我正在尝试从css文件中提取所有图像(.jpg,.png,.gif)uri。

示例css

.blockpricecont{width:660px;height:75px;background:url('../images/postBack.jpg') 
repeat-x;/*background:url('../images/tabdata.jpg') repeat-x;*/border: 1px solid #B7B7B7;

使用正则表达式 -

  images = re.compile("(?:\()(?:'|\")?(.*\.jpg('?))", flags=re.IGNORECASE)

问题是,几乎没有带有注释代码的css类(/ * ---- * /),这些注释包含.jpg引用。我得到的上述正则表达式的输出是

output
 ["../images/postBack.jpg') repeat-x;/*background:url('../images/tabdata.jpg'"]

expected output:
 ["../images/postBack.jpg"]

我希望我的正则表达式在.jpg的第一场比赛中停止,但它一直持续到线的末尾。

提前致谢。

4 个答案:

答案 0 :(得分:4)

print re.findall('url\(([^)]+)\)',target_text)

我认为应该有效

答案 1 :(得分:3)

最简单的方法是在匹配之前删除注释:

css = re.sub(r'(?s)/\*.*\*/', '', css)

但是,我确实同意Matthew使用专用解析器会更好。以下是tinycss的示例:

import tinycss

def urls_from_css(css):
    parser = tinycss.make_parser()
    for r in parser.parse_stylesheet(css).rules:
        for d in r.declarations:
            for tok in d.value:
                if tok.type == 'URI':
                    yield tok.value

for url in urls_from_css(css):
    print url

答案 2 :(得分:0)

这可能更适合于css解析器。我没有用它,但我之前看过this one

答案 3 :(得分:0)

也许,这样一来,先用re.sub剥离评论然后重新找到好东西。

example_css = """.blockpricecont{width:660px;height:75px;background:url('../images/postBack.jpg') 
repeat-x;/*background:url('../images/tabdata.jpg') repeat-x;*/border: 1px solid #B7B7B7;"""


import re

css_comments_removed = re.sub(r'\/\*.*?\*\/', '', example_css)

pattern = re.compile(r"(\'.*?\.[a-z]{3}\')")
matches = pattern.findall(css_comments_removed)
for i in matches:
    print(i)

打印

'../images/postBack.jpg'