【问题标题】:Remove all html in python?删除python中的所有html?
【发布时间】:2010-10-19 22:35:26
【问题描述】:

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

【问题讨论】:

  • beautifulsoup 怎么会出现跨站脚本问题?
  • 也许他们的意思是 CSS。

标签: python tags xss lxml


【解决方案1】:

在元素上尝试.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 元素(但我假设您只对“真实”文本感兴趣,因此首先进行清理)
  • 正在使用 clean_html( string ) 来做不同的事情
  • 当我使用 html.fromstring 而不是 html.parse 时,我得到一个错误 ""AttributeError: 'HtmlElement' object has no attribute 'getroot'""
  • @kommradHomer: 那是因为parse() 返回一个元素树,但fromstring() 返回一个元素(所以你不需要getroot()
【解决方案2】:

我相信,这段代码可以帮助你:

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)

【讨论】:

  • 经过快速实验,这个解决方案似乎比这个解决方案做得更好,例如stackoverflow.com/a/5332984/787842,但我想了解更多关于正确参数化@987654324 的方法@object(因为有很多很多选项);例如在这种情况下,有一个空的allow_tags 列表和remove_unknown_tags 设置为False 在我看来有点奇怪,逻辑上。
  • @cjauvin:当然,你是对的!这是一种黑客行为。但我确信没有人想在参数remove_tags 中指定所有需要删除的标签,如果他们想删除所有标签的话。不幸的是,在这种情况下,Cleaner 的实现鼓励用户为此目的使用allow_tagsremove_unknown_tags github.com/lxml/lxml/blob/…
  • 这会将结果包装在一个 div 中
【解决方案3】:

这使用了 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() 方法在没有包装元素的情况下恢复文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2016-06-01
    • 2012-11-19
    • 2011-07-31
    相关资源
    最近更新 更多