2013-12-03 3 views
9

Я пытаюсь очистить таблицу html, используя lxml.html.clean.Cleaner(). Мне нужно разделить атрибуты javascript, но хотелось бы сохранить встроенный CSS-стиль. Я думал, что стиль = False установка по умолчанию:Как сохранить встроенный стиль CSS с помощью lxml.html.clean.Cleaner() в Python?

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 

Это не поможет.

Обновление: Я использую Python 2.6.6 + lxml 3.2.4 на Dreamhost и Python 2.7.5 + lxml 3.2.4 на локальном Macbook. Те же результаты. Другое дело: есть атрибут Javacript связанных в моем HTML:

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

Может быть LXML раздел это связанное Javacript стиля и лечение другим стилей то же самое? Надеюсь нет.

Спасибо за понимание!

+1

Какие версии Python и LXML вы используете? – mzjn

+0

Привет, mzjn, спасибо за ваш комментарий! См. Обновления. – laviex

ответ

7

Он работает, если вы установили 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 и в то же время защитить от других небезопасных атрибутов.

код Demo:

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> 
+0

Это действительно работает! Большое спасибо. Теперь мне интересно, почему style = False не будет работать. Я думаю, это может быть из-за этого кода, некоторый компромисс между javascript и стилем (AND safe_attrs). Спасибо за обходной путь и показывая мне исходный код, чтобы читать дальше – laviex

+0

Это приятное решение! –

Смежные вопросы