【问题标题】:How to preserve inline CSS style with lxml.html.clean.Cleaner() in Python?如何在 Python 中使用 lxml.html.clean.Cleaner() 保留内联 CSS 样式?
【发布时间】:2013-12-19 01:57:22
【问题描述】:

我正在尝试使用 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 相关的属性:

&lt;td style="cursor:pointer;"&gt;Ticker&lt;/td&gt;

会不会是 lxml 剥离了这种与 JavaScript 相关的样式并以相同的方式对待其他样式?我希望不会。

【问题讨论】:

  • 你使用什么版本的 Python 和 lxml?
  • 嗨,mzjn,感谢您的评论!请查看更新。

标签: python lxml lxml.html


【解决方案1】:

如果你设置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>

【讨论】:

  • 确实有效!非常感谢。现在我想知道为什么 style=False 不起作用。我想这可能是因为这段代码,javascript 和样式(和 safe_attrs)之间的一些权衡。感谢您的解决方法并向我展示源代码以阅读更多内容
  • 这是一个很好的解决方案!
猜你喜欢
  • 2010-11-16
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2013-05-24
  • 2010-10-02
相关资源
最近更新 更多