2

我正在尝试从 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

4 回答 4

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

我认为这应该有效

于 2012-09-21T16:28:26.040 回答
4

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

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
于 2012-09-21T16:33:19.547 回答
1

也许,这样,首先用 re.sub 去除评论,然后 re.findall 好东西。

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'
于 2012-09-21T16:46:48.523 回答
0

这可能更适合css解析器。我没用过,但是我以前看过推荐的这个

于 2012-09-21T16:26:40.727 回答