使用BeautifulSoup解析文档而不解析<code>标记的内容

Dor*_*Dor 10 html python django beautifulsoup pygments

我正在和Django一起写博客应用程序.我想让评论编写者使用一些标签(比如<strong>,a等等)但禁用所有其他标签.

另外,我想让他们把代码放在<code>标签中,并让pygments解析它们.

例如,有人可能会写这个评论:

I like this article, but the third code example <em>could have been simpler</em>:

<code lang="c">
#include <stdbool.h>
#include <stdio.h>

int main()
{
    printf("Hello World\n");
}
</code>
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用BeautifulSoup解析注释以去除不允许的HTML标记时,它还会解析<code>块的内部,并将<stdbool.h>和<stdio.h>视为HTML标记.

我怎么能告诉BeautifulSoup不要解析<code>块?也许还有其他HTML解析器更适合这份工作?

Mar*_*tos 1

问题在于,<code>按照 HTML 标记的正常规则进行处理,<code>标签内的内容仍然是 HTML(标签的存在主要是为了驱动 CSS 格式,而不是改变解析规则)。

\n\n

您想要做的是创建一种与 HTML 非常相似但不相同的不同标记语言。简单的解决方案是假设某些规则,例如“<code>并且</code>必须单独出现在一行上”,并自己进行一些预处理。

\n\n
    \n
  1. 一个非常简单的 \xe2\x80\x94 虽然不是 100% 可靠的 \xe2\x80\x94 技术是将^<code>$和替换<code><![CDATA[为。它并不完全可靠,因为如果代码块包含,事情就会变得非常错误。^</code>$]]></code>]]>
  2. \n
  3. 更安全的选择是用等效的字符实体引用( 、和 )替换代码块内的危险字符( 、和<可能>就足够了) 。您可以通过将您标识的每个代码块传递给 来完成此操作。&&lt;&gt;&amp;cgi.escape(code_block)
  4. \n
\n\n

完成预处理后,像往常一样将结果提交给 BeautifulSoup。

\n