J'essaie de trouver toutes les URL relatives dans un fichier CSS et de les remplacer par une URL absolue. Je sais comment obtenir le chemin absolu mais je dois d'abord trouver toutes les occurrences de l'url () dans le fichier, puis saisir le chemin relatif et le remplacer par un chemin absolu. Voici ce que j'ai essayé jusqu'à présent.

Étant donné que mon Css est:

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')"

J'essaie ce code:

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

Mais il ne renvoie pas l'url et renvoie plutôt le code css malheureusement. Est-ce que quelqu'un peut m'aider avec ça. Toute suggestion très appréciée

0
Milix 13 avril 2018 à 17:29

4 réponses

Meilleure réponse

En utilisant des expressions régulières, vous pouvez facilement répertorier toutes les URL. Comme ça :

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)

Production :

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

Si vous voulez les indices, vous pouvez utiliser findIter au lieu de 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)]

Production

[(11, 49), (56, 103), (123, 155)]
1
pensfute 13 avril 2018 à 14:51

Utilisez des expressions régulières, quelque chose comme:

import re

// ? = non-greedy
result = re.search( "url\(.+?\)", css)
print result.groups()
1
vogomatix 13 avril 2018 à 16:33

Vous pouvez également le faire comme ceci:

1) J'ai légèrement modifié l'expression régulière de pensflute, de sorte qu'il ne récupère pas également les images littérales, comme "url ( data: image / png .. "qui sont elles-mêmes une image et ne sont donc pas chargées en externe. De plus, certains sites Web n'utilisent pas de guillemets ('') pour encapsuler les URL, car cela fonctionnera également sans, donc j'ai également ajouté celles-ci en option dans le regex.

2) Que je supprime les doublons de la liste que j'ai générée, ce qui est nécessaire lorsque vous remplacez les URL dans la partie suivante.

3) Enfin, je parcoure la liste des URL qui doivent être remplacées par leurs URL absolues, et j'utilise la fonction urljoin () pour y parvenir. Cela résoudra également tous les liens vers le bon format même s'ils sont d'un niveau supérieur, comme "../images/someimg.png"

4) Et enfin vous avez votre CSS modifié où toutes les URL sont absolues :)

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)

Quel produit ce :

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}
0
Vasco 3 janv. 2020 à 21:41

Cela affichera chacune des URL, en supposant qu'il n'y a pas de parenthèses parasites dans la chaîne:

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
Scott Hunter 13 avril 2018 à 14:43