代码之家  ›  专栏  ›  技术社区  ›  Milix

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

  •  0
  • Milix  · 技术社区  · 6 年前

    我试图在css文件中找到所有相对url,并用绝对url替换它们。我知道如何获取绝对路径,但首先我需要在文件中找到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 回复  |  直到 6 年前
        1
  •  1
  •   pensfute    6 年前

    使用正则表达式,您可以轻松列出每个URL。就像这样:

    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)]
    
        2
  •  1
  •   Scott Hunter    6 年前

    这将打印每个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)
    
        3
  •  1
  •   vogomatix    6 年前

    使用正则表达式,例如:

    import re
    
    // ? = non-greedy
    result = re.search( "url\(.+?\)", css)
    print result.groups()
    
        4
  •  0
  •   Vasco    4 年前

    您也可以这样做:

    1) 我把正则表达式改成 pensflute 有一点,所以它也不会抓取文字图像,比如“url(数据:image/png..)”它们本身是一个图像,因此没有外部加载。还有一些网站不使用引号(“”)来包装URL,因为它也可以在没有引号的情况下工作,所以我还在regex中添加了可选的引号。

    2) 然后,我将从生成的列表中删除重复项,这是在下一部分替换URL时需要的。

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

    4) 最后,您有了经过修改的CSS,其中所有URL都是绝对的:)

    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}