我正在尝试从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的第一场比赛中停止,但它一直持续到线的末尾。
提前致谢。
答案 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'