Scott Treseder
Scott Treseder

Reputation: 61

Python code to consolidate CSS into HTML

Looking for python code that can take an HTML page and insert any linked CSS style definitions used by that page into it - so any externally referenced css page(s) are not needed.

Needed to make single files to insert as email attachments from existing pages used on web site. Thanks for any help.

Upvotes: 5

Views: 8503

Answers (3)

its me
its me

Reputation: 241

You can use pynliner. Example from their documentation:

html = "html string"
css = "css string"
p = Pynliner()
p.from_string(html).with_cssString(css)

Upvotes: 2

Permafacture
Permafacture

Reputation: 410

Sven's answer helped me, but it didn't work out of the box. The following did it for me:

import bs4   #BeautifulSoup 3 has been replaced
soup = bs4.BeautifulSoup(open("index.html").read())
stylesheets = soup.findAll("link", {"rel": "stylesheet"})
for s in stylesheets:
    t = soup.new_tag('style')
    c = bs4.element.NavigableString(open(s["href"]).read())
    t.insert(0,c)
    t['type'] = 'text/css'
    s.replaceWith(t)
open("output.html", "w").write(str(soup))

Upvotes: 4

Sven Marnach
Sven Marnach

Reputation: 601489

You will have to code this yourself, but BeautifulSoup will help you a long way. Assuming all your files are local, you can do something like:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(open("index.html").read())
stylesheets = soup.findAll("link", {"rel": "stylesheet"})
for s in stylesheets:
    s.replaceWith('<style type="text/css" media="screen">' +
                  open(s["href"]).read()) +
                  '</style>')
open("output.html", "w").write(str(soup))

If the files are not local, you can use Pythons urllib or urllib2 to retrieve them.

Upvotes: 2

Related Questions