Skip to main content
 首页 » 编程设计

python之如何防止 BeautifulSoup 自动关闭看起来像标签但实际上不是的东西

2025年05月04日6sxdcgaq8080

我正在使用 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() 

提前致谢。

请您参考如下方法:

使用基于 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) 

感谢所有提供帮助的人。