2010-10-19 63 views
1

有没有办法使用lxml.html删除/转义html标签,而不是美丽的有一些xss的问题?我尝试使用更清洁,但我想删除所有的HTML。删除python中的所有html?

+7

如何beautifulsoup具有跨站点脚本问题? – jball 2010-10-19 22:40:02

回答

9

尝试在元素上使用.text_content()方法,在使用lxml.html.clean来摆脱不需要的内容(脚本标签等)后可能是最好的方法。例如:

from lxml import html 
from lxml.html.clean import clean_html 

tree = html.parse('http://www.example.com') 
tree = clean_html(tree) 

text = tree.getroot().text_content() 
+0

我想摆脱一切,不只是不安全的标签 – Timmy 2010-10-20 13:26:12

+1

如果你想摆脱一切,为什么不只是'text ='''? ;-)严重的是,'text_content()'将摆脱所有的标记,但清洗也将摆脱例如。 CSS样式表规则和JavaScript,它们也被编码为文本*里面*元素(但我认为你只对“真实”文本感兴趣,因此首先进行清理) – Steven 2010-10-20 14:09:57

+0

正在使用clean_html(字符串),它在不同事物 – Timmy 2010-10-20 20:18:26

11

我相信,这个代码可以帮助您:

from lxml.html.clean import Cleaner 

html_text = "<html><head><title>Hello</title><body>Text</body></html>" 
cleaner = Cleaner(allow_tags=[''], remove_unknown_tags=False) 
cleaned_text = cleaner.clean_html(html_text) 
+0

经过一个快速的实验,这个解决方案似乎比这个更好的工作,例如http://stackoverflow.com/a/5332984/787842,但我想知道更多关于正确参数化'Cleaner'对象的方法(因为有很多选项)。例如在这种情况下,在逻辑上,让一个空的'allow_tags'列表和'remove_unknown_tags'设置为'False'在我看来有点奇怪。 – cjauvin 2015-05-11 14:40:04

+0

@cjauvin:当然,你是对的!这是一种破解。但是我确定没有人想要在参数'remove_tags'中指定所有必须删除的标签,如果他们想要删除它们。不幸的是,在这种情况下,'Cleaner'的实现鼓励用户使用带有'remove_unknown_tags'的'allow_tags'来达到这个目的https://github.com/lxml/lxml/blob/54a8bfedcd0f32274a4ebf9e2d8e391fe759aba5/src/lxml/html/clean.py#L387 – dni 2015-05-13 12:31:17