如何在Python中使用lxml.html.clean.Cleaner()保留内联CSS样式?

时间:2013-12-03 05:55:11

标签: python lxml lxml.html

我正在尝试使用lxml.html.clean.Cleaner()清理html表。我需要去掉javascript属性,但是想保留内联css样式。我认为style = False是默认设置:

import lxml.html.clean
cleaner = lxml.html.clean.Cleaner()

然而,当我致电cleaner.clean_html(doc)

<span style="color:#008800;">67.51</span>

将成为

<span>67.51</span>

基本上,样式不会保留。我试着添加:

cleaner.style= False

没有用。

更新:我在Dreamhost上使用Python 2.6.6 + lxml 3.2.4,在本地Macbook上使用Python 2.7.5 + lxml 3.2.4。结果相同。另一件事:我的html中有一个与javacript相关的属性:

<td style="cursor:pointer;">Ticker</td>

是不是lxml剥离了这个javacript相关的样式并且对待其他样式相同?希望不是。

感谢您的任何见解!

1 个答案:

答案 0 :(得分:9)

如果您设置cleaner.safe_attrs_only = False,则可以使用。

一组“安全”属性(Cleaner.safe_attrs)在lxml.html.defs模块(source code)中定义,style未包含在集合中。

但是,使用cleaner.safe_attrs_only = False甚至比Cleaner(safe_attrs=lxml.html.defs.safe_attrs | set(['style']))更好。这将保留style,同时保护其他不安全的属性。

演示代码:

from lxml import html
from lxml.html import clean

s ='<marquee><span style="color: #008800;">67.51</span></marquee>'
doc = html.fromstring(s)
cleaner = clean.Cleaner(safe_attrs=html.defs.safe_attrs | set(['style']))

print html.tostring(cleaner.clean_html(doc))

输出:

<div><span style="color: #008800;">67.51</span></div>