【问题标题】:How to prevent BeautifulSoup from self-closing things that look like tags but aren't?如何防止 BeautifulSoup 自动关闭看起来像标签但不是标签的东西?
【发布时间】:2012-02-10 04:51:04
【问题描述】:

我正在使用 BeautifulSoup 从任意文本集中转义所有 HTML 标记(一组预先批准的标记除外,例如 a)。但是,如果它们是实际有效的 HTML 标签,我只希望它转义标签。如果某些东西看起来像一个标签,但不是,它最终会添加一些 HTML 来关闭它,这是我不想要的。

示例:如果有人输入文本<integer>,我的代码最终会输出<integer></integer> 而不仅仅是<integer>

这是代码(value 是 HTML 字符串,VALID_TAGS 只是可接受的标签名称列表)。

soup = BeautifulSoup.BeautifulSoup(
  value, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
# Loop through all the tags. If it is invalid, escape the characters.
for tag in soup.findAll():
  if tag.name not in VALID_TAGS:
    tag.replaceWith(cgi.escape(str(tag)))
return soup.renderContents()

提前致谢。

【问题讨论】:

  • 我的看法是你使用了错误的工具来完成这项工作。
  • 至少你还应该过滤属性; <a onmouseover="alert('Oh dear')">Look at this!</a>看看html5sec.org
  • 我也在过滤掉属性(同样,白名单除外)。为了清楚起见,我从示例代码和问题中删除了它。

标签: python html-parsing beautifulsoup


【解决方案1】:

使用基于this answer 的html5lib 作为起点来解决这个问题。这是我最终得到的一个版本,它与我上面开始的 BeautifulSoup 代码做同样的事情,除了在我描述的 <integer> 案例中正常工作:

p = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer, tree=treebuilders.getTreeBuilder("dom"))
dom_tree = p.parseFragment(value)
walker = treewalkers.getTreeWalker("dom")
stream = walker(dom_tree)
s = serializer.htmlserializer.HTMLSerializer(quote_attr_values=True)
return s.render(stream)

感谢所有帮助过的人。

【讨论】:

    【解决方案2】:

    你做错了(tm)。 BeatifulSoup 不适合那样使用。 看看这个吧:http://code.activestate.com/recipes/52281-strip-tags-and-javascript-from-html-page-leaving-o/ 这个配方删除了无效的标签,你听起来像是想保留它们但逃脱了。应该很容易修改。

    【讨论】:

    • 这里的问题是recipe使用了sgmllib,在2.6之后就被弃用了。
    • 好的,所以使用 HTMLParser 就像这里描述的 unethicalblogger.com/2008/05/03/parsing-html-with-python.html
    • 对其进行了编码,并且在大多数情况下都可以使用,但会因<<script>script>alert("Biscuit!");</</script>script等看起来无效的输入而窒息
    猜你喜欢
    • 2016-05-04
    • 2011-11-20
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2013-11-06
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多