如何防止BeautifulSoup自动关闭看似标签但不是的东西?
我正在使用BeautifulSoup来处理一些文本,目的是把所有的HTML标签都转义掉,除了我事先批准的一些标签,比如。不过,我只想在这些标签是真正有效的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()
提前谢谢你。
2 个回答
0
你这样做是不对的(tm)。
BeautifulSoup 并不是用来这样使用的。
你可以看看这个链接:http://code.activestate.com/recipes/52281-strip-tags-and-javascript-from-html-page-leaving-o/。
这个方法可以去掉无效的标签,而你听起来是想保留这些标签,只是想让它们变得安全一些。这个修改应该很简单。
1
我根据这个答案,用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)
感谢所有帮助过我的人。