premailer.py - Transform CSS into line style attributes with lxml.html

11 July 2009   9 comments   Python

Mind That Age!

This blog post is 8 years old! Most likely, its content is outdated. Especially if it's technical.

Powered by Fusion×

By blogging about it I can pretty much guarantee that someone will comment and say "Hey, why didn't you use the pypi/alreadyexists package which does the same thing but better". I couldn't find one after a quick search and I felt the hacker mood creeping up on my begging me to (re)invent it.

premailer.py takes a HTML page, finds all CSS blocks and transforms these into style attributes. For example, from this:

<html>
  <head>
    <title>Test</title>
    <style>
    h1, h2 { color:red; }
    strong {
      text-decoration:none
    }
    </style>
  </head>
  <body>
    <h1>Hi!</h1>
    <p><strong>Yes!</strong></p>
  </body>
</html>

You get this:

<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <h1 style="color:red">Hi!</h1>
    <p><strong style="text-decoration:none">Yes!</strong></p>
  </body>
</html>

Why is this useful? When you're writing HTML emails. Like this newsletter app that I'm working on.

I just wrote it late yesterday and it needs lots of work to impress but for the moment it works for me. If I take the time to tidy it up properly I'll turn it into a package. Assuming there isn't one already :)

UPDATE

No available on github.com and as a PyPi package

UPDATE #2

Two new copy-cats have been released:

Might be worth poking around at these if my premailer isn't good enough.

Comments

Walter Dörwald
XIST includes a function for doing this. An online version of the CSS inliner is available from http://lltools.appspot.com/CSSInliner.html
Marius Gedminas
I've been looking for something like this to use as a PyBlosxom plugin to inline styles in the RSS feed. And when I say "looking", I mean "posting a question and waiting for lazyweb to come up with an answer". So, thanks ;-)

What is the licence of your code?
Peter Bengtsson
No licence yet but I'm guessing something very forgiving. I've made a much improved version but haven't uploaded it yet.
I guess I'll stick it on pypi
Lionel Barret
funny I have done the same a few weeks ago. I'll compare with your module if there is anything I can add.
astro
This seems to be exactly what am I looking for. I installed it, but how can I use it? Can you post some instructions or tell us where to find them?
Anonymous
Very nice, thank you.
Alex Hayes
I've created a django template tag that can be used with premailer - see https://github.com/alexhayes/django-premailer
Peter Bengtsson
That is great!
Thank you for posting a comment

Your email will never ever be published


Related posts

Previous:
My first iPhone web app - Crosstips iPhone interface 01 July 2009
Next:
setuptools usability - not good, what can be done? 15 July 2009
Related by Keyword:
Ultrafast loading of CSS 01 September 2017
Premailer 3.0.0 - classes kept by default 07 June 2016
CSS Bloat Comparison 03 June 2016
How to no-mincss links with django-pipeline 03 February 2016
django-semanticui-form 14 September 2015
Related by Text:
How to use premailer as a command line script 13 July 2012
html2plaintext Python script to convert HTML emails to plain text 10 August 2007
premailer now excludes pseudo selectors by default 27 May 2013
Bestest and securest way to handle Python dependencies 01 February 2016
domstripper - A lxml.html test project 20 November 2008