Python循环遍历CSS文件中的所有URL并替换

时间:2018-04-13 14:29:56

标签: python css string url substring

我试图在css文件中找到所有相对网址,并用绝对网址替换它们。我知道如何获得绝对路径,但首先我需要找到文件中url()的所有出现,然后获取相对路径并用绝对路径替换它。这是我到目前为止所尝试的内容。

鉴于我的Css是:

css= "background:url(/pub-assets/img/index/sec8-bg.png)
src:url('../fonts/fontawesome-webfont.eot?v=4.6.3')
background-image:url('../img/index/blok1-bg.jpg')"

我正在尝试这段代码:

start = "url("
end = ")"
print css[css.find(start)+len(start):css.rfind(end)]

但它不返回url而是遗憾地返回css代码。 谁能帮我这个。任何建议都非常感谢

4 个答案:

答案 0 :(得分:1)

这将打印每个URL,假设字符串中没有任何迷路括号:

start = "url("
end = ")"
txt = css
start_pos = txt.find(start)
while start_pos >= 0:
    end_pos = txt.find(end)
    print(txt[start_pos+len(start):end_pos])
    txt = txt[end_pos+len(end):]
    start_pos = txt.find(start)

答案 1 :(得分:1)

使用正则表达式,例如:

import re

// ? = non-greedy
result = re.search( "url\(.+?\)", css)
print result.groups()

答案 2 :(得分:1)

使用正则表达式,您可以轻松列出每个网址。像那样:

import re

css= "background:url(/pub-assets/img/index/sec8-bg.png) \n src:url('../fonts/fontawesome-webfont.eot?v=4.6.3') \n background-image:url('../img/index/blok1-bg.jpg')"

re.findall(r'url\((.*?)\)', css)

输出:

['/pub-assets/img/index/sec8-bg.png',
 "'../fonts/fontawesome-webfont.eot?v=4.6.3'",
 "'../img/index/blok1-bg.jpg'"]

如果您想要索引,可以使用findIter而不是findall https://docs.python.org/2/library/re.html#re.finditer

[(m.start(0), m.end(0)) for m in re.finditer(r'url\((.*?)\)', css)]

输出

[(11, 49), (56, 103), (123, 155)]

答案 3 :(得分:0)

您也可以这样做:

1)我从pensflute稍微修改了正则表达式,因此它也不会抓取文字图像,例如“ url(data:image / png ..“)本身就是图像,因此不在外部还有一些网站不使用引号('')来包装网址,因为它也可以在不使用引号的情况下使用,因此我也在正则表达式中将其添加为可选内容。

2)比起从生成的列表中删除重复项,当您替换下一部分中的url时,这是必需的。

3)最后,我遍历了不需要用其绝对URL替换的URL列表,并使用urljoin()函数实现了这一点。 即使它们位于1级以上,这也会将所有链接解析为正确的格式,例如“ ../ images / someimg.png”

4)最后,您将拥有修改后的CSS,其中所有网址都是绝对的:)

import re
from urllib.parse import urljoin

cssUrl = 'https://www.example.nl/static/bundles/css/someApp.css'
css= "background:url(/pub-assets/img/index/sec8-bg.png) \n src:url('../fonts/fontawesome-webfont.eot?v=4.6.3') \n background-image:url('../img/index/blok1-bg.jpg') \n  .grabbing{cursor:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAO0lEQVQ4y2NgGHbgPxTjY+PWDAP42PgM+k8IwNRQZAg+A/5TYsB/UgBFBtDM/0QZQkxawGsI3QygLwAAbjZlqS88cqkAAAAASUVORK5CYII=) 8 8,move}"

# 1) Find all css links
links = re.findall(r'url\(\'?([(..)/].*?)\'?\)', css)

# 2) Clear all duplicates
links = list(dict.fromkeys(links))

# print(links)
# 3) Replace all links with the absolute path
for link in links:
    css = css.replace(link, urljoin(cssUrl, link))

# 4) Print out the modified css
print(css)

输出以下内容

background:url(https://www.example.nl/pub-assets/img/index/sec8-bg.png) 
src:url('https://www.example.nl/static/bundles/fonts/fontawesome-webfont.eot?v=4.6.3') 
background-image:url('https://www.example.nl/static/bundles/img/index/blok1-bg.jpg')
.grabbing{cursor:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAO0lEQVQ4y2NgGHbgPxTjY+PWDAP42PgM+k8IwNRQZAg+A/5TYsB/UgBFBtDM/0QZQkxawGsI3QygLwAAbjZlqS88cqkAAAAASUVORK5CYII=) 8 8,move}