【发布时间】:2010-10-19 22:35:26
【问题描述】:
有没有办法使用 lxml.html 而不是有一些 xss 问题的 beautifulsoup 来删除/转义 html 标签?我尝试使用清洁器,但我想删除所有 html。
【问题讨论】:
-
beautifulsoup 怎么会出现跨站脚本问题?
-
也许他们的意思是 CSS。
有没有办法使用 lxml.html 而不是有一些 xss 问题的 beautifulsoup 来删除/转义 html 标签?我尝试使用清洁器,但我想删除所有 html。
【问题讨论】:
在元素上尝试.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()
【讨论】:
text=''? ;-) 说真的,text_content() 将摆脱所有标记,但清洁也会摆脱例如。 css 样式表规则和 javascript,它们也被编码为文本 inside 元素(但我假设您只对“真实”文本感兴趣,因此首先进行清理)
parse() 返回一个元素树,但fromstring() 返回一个元素(所以你不需要getroot())
我相信,这段代码可以帮助你:
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)
【讨论】:
allow_tags 列表和remove_unknown_tags 设置为False 在我看来有点奇怪,逻辑上。
remove_tags 中指定所有需要删除的标签,如果他们想删除所有标签的话。不幸的是,在这种情况下,Cleaner 的实现鼓励用户为此目的使用allow_tags 和remove_unknown_tags github.com/lxml/lxml/blob/…
这使用了 lxml 的清理功能,但避免了将结果包装在 HTML 元素中。
import lxml
doc = lxml.html.document_fromstring(str)
cleaner = lxml.html.clean.Cleaner(allow_tags=[''], remove_unknown_tags=False)
str = cleaner.clean_html(doc).text_content()
或作为一个班轮
lxml.html.clean.Cleaner(allow_tags=[''], remove_unknown_tags=False).clean_html(lxml.html.document_fromstring(str)).text_content()
它的工作原理是手动将 html 解析为文档对象,并将其提供给更清洁的类。这样 clean_html 也返回一个对象而不是一个字符串。然后可以使用 text_content() 方法在没有包装元素的情况下恢复文本。
【讨论】: