我正在使用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()
提前致谢。
答案 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/ 此配方删除无效标签,您听起来像是要保留它们但是要转义。应该是一个非常简单的修改。