如何防止BeautifulSoup自我关闭看似标签的东西但不是?

时间:2012-01-14 03:04:49

标签: python html-parsing beautifulsoup

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

示例:如果有人在文字<integer>中输入,我的代码最终会吐出&lt;integer&gt;&lt;/integer&gt;,而不仅仅是&lt;integer&gt;

以下是代码(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()

提前致谢。

2 个答案:

答案 0 :(得分: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)

感谢所有帮助过的人。

答案 1 :(得分:0)

你做错了(tm)。 BeatifulSoup并不意味着像这样使用。 请改为看一下:http://code.activestate.com/recipes/52281-strip-tags-and-javascript-from-html-page-leaving-o/ 此配方删除无效标签,您听起来像是要保留它们但是要转义。应该是一个非常简单的修改。