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
4 réponses
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)]
Utilisez des expressions régulières, quelque chose comme:
import re
// ? = non-greedy
result = re.search( "url\(.+?\)", css)
print result.groups()
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}
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)
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.