Я смог воспроизвести это поведение после установки lxml 3.1.0. Вот решение, основанное на «патче обезьяны» - замена шаблона регулярного выражения lookup в модуле lxml.html.clean
для исключения ссылок, содержащих данные: image /.*; base64 из удаления.
import re
import lxml
from lxml.html.clean import Cleaner
new_pattern = '\s*(?:javascript:|jscript:|livescript:|vbscript:|data:[^(?:image/.+;base64)]+|about:|mocha:)'
print(new_pattern)
lxml.html.clean._javascript_scheme_re = re.compile(new_pattern, re.I)
cleaner = Cleaner()
dochtml = """
<img src="http://test.com/img.png"/>
<img src="data:image/png;base64,aGVsbG8="/>
<img src="data:unsafe/contents;base64,aGVsbG8="/>
<img src="data:text/html;base64,PGh0bWw+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KCdoaScpPC9zY3JpcHQ+PC9odG1sPg=="/>
"""
r = cleaner.clean_html(dochtml)
print(r)
Результат
<span><img src="http://test.com/img.png">
<img src="data:image/png;base64,aGVsbG8=">
<img src="">
<img src="">
</span>
Недостаток этого - это зависит от внутреннего переменного имени, которое не было объявлено в открытом интерфейсе для очистки. Поэтому разработчики модулей могли изменить имя переменной или улучшить свою версию регулярного выражения.
Чтобы быть безопасным, я создам обработчик URL-адресов на веб-сервере для возврата содержимого изображения из базы данных по идентификатору. Поэтому в вашем html-документе это будет примерно так: <img src="http://myserver/showimg?id=123213">
. Но это связано с добавлением множества дополнительных движущихся частей - например, с веб-сервером и т. Д. Также это не сработает, если нежелательно, чтобы весь мир имел доступ к этим изображениям.
Старый ответ:
Должна быть предусмотрена возможность настроить уборщик, чтобы эти теги, но я не могу воспроизвести свое дело - он просто работает для меня. Я использую python 2.7.2 и lxml 2.2.8 win-32. Просьба уточнить, какие у вас версии python и lxml?
Я попытался запустить пример и вернулся вторые содержимое изображения тегов, которые не были удалены
Может уборщик процесс уже разобран DOM? Вы можете сделать это, указав белый список, указав 'data:' URI, которые вы хотите сохранить в пользовательском атрибуте, например 'data-src'. Чистое устройство должно надеяться игнорировать эти атрибуты, когда вы запускаете его против DOM, после чего вы снова проводите его и восстанавливаете URI обратно в 'src'. – millimoose
Я не уверен, что понимаю, что вы предлагаете. Сначала очистите текст, а затем вставьте изображение? К сожалению, я не могу, это метод, называемый непосредственно перед рендерингом шаблона, и я не могу изменить рабочий процесс. –
Hm. Еще более хакерское обходное решение будет использовать немного Javascript для восстановления атрибутов 'src' при загрузке страницы, но я признаю, что это уже довольно уродливо. Кроме того, очиститель [написан на Python] (https://github.com/lxml/lxml/blob/master/src/lxml/html/clean.py) - вы можете использовать отладчик Python, чтобы сориентироваться вокруг него, чтобы увидеть почему он удаляет 'data:' URI и влияет ли один из документированных параметров на это поведение. – millimoose