【问题标题】:Python loop through all urls in CSS file and replacePython循环遍历CSS文件中的所有url并替换
【发布时间】:2018-04-13 14:29:55
【问题描述】:

我正在尝试在 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 代码。 谁能帮我这个。任何建议都非常感谢

【问题讨论】:

  • 这个字符串中有3个URL;你要求找到第一个的开始和最后一个的结束。
  • 我需要获取 url() 之间的 url。我有一个巨大的 css 文件,这是我拥有的 url 结构的一个示例。
  • 你是一次读取整个文件,你应该逐行读取

标签: python css string url substring


【解决方案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)]

【讨论】:

    【解决方案2】:

    这将打印每个 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)
    

    【讨论】:

    • 谢谢。这个答案也是正确的,因为我更喜欢@pensfute 答案。
    • 我也更喜欢它。
    【解决方案3】:

    使用正则表达式,例如:

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

    【讨论】:

      【解决方案4】:

      你也可以这样做:

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

      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}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-24
        • 2016-01-07
        • 2017-09-08
        • 2014-12-15
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多