我正在使用 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()
提前致谢。
请您参考如下方法:
使用基于 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)
感谢所有提供帮助的人。
