gpt4 book ai didi

python - 我可以在 Python Markdown 中将标签列入白名单吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:19 25 4
gpt4 key购买 nike

问题

我想在转换期间指定要列入白名单的标签列表。例如,如果我只想转换 <p> , <ol> , <li> , 和其他一些标签,但忽略所有其他标签,然后给出如下值:

### Header

This is a paragraph.

# Code snippet
def spam():
pass

1. One
2. Two
3. Three

我希望将其准确转换为:

### Header

<p>This is a paragraph.</p>

# Code snippet
def spam():
pass

<ol>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ol>

我意识到我可以使用 Bleach清除我不需要的标签,但如果可能的话,我宁愿不首先转换它们。

备注:

我指的是 https://pypi.org/project/Markdown/

最佳答案

不,您不能将标签“列入白名单”,但您可以使用 Extension API改变解析器的各个部分。但是,您可能并不真的想要那样。

例如,如果您不想解析 header 和代码块,则可以删除这些处理器:

from markdown.extensions import Extension

class MyExtension(Extension):
def extendMarkdown(self, md):
md.parser.blockprocessors.deregister('hashheader')
md.parser.blockprocessors.deregister('setextheader')
md.parser.blockprocessors.deregister('code')

但是,这不会给您想要的结果,因为解析器将返回将该文本包装在 <p> 中。标签。事实上,这是 Markdown 语法中固有的。任何未被识别为其他内容的内容都被视为段落。

因此,您的输入可能会产生以下输出:

<p>### Header</p>

<p>This is a paragraph.</p>

<p> # Code snippet
def spam():
pass</p>

<ol>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ol>

更复杂的是 HTML 对“无关紧要的空白”的处理。具体来说,除非直接指示不要这样做(例如在代码块中),否则在浏览器中呈现 HTML 时,所有空格都将压缩为一个空格。因此,包含未解析代码块的段落将难以阅读:

# Code snippet def spam(): pass

如果这不是您想要的,那么您可能需要用您自己的自定义处理器替换现有处理器,这些处理器可以识别代码块和 header ,但返回默认 HTML 以外的内容以避免它们被包装在 <p> 中。标签。但是,这将有效地涉及替换大部分解析器。

此外,如果不包含任何标签,纯文本将全部压缩成一个段落。例如,这个输入:

# Header 1

# code snippet
def spam():
pass

## Header 2

会像这样呈现:

# Header 1 # code snippet def spam(): pass ## Header 2

这可能不是您想要的。将文本包装在 <p> 中tags 实际上是一个更理想的结果,因为它至少会呈现为:

# Header 1

# Code snippet def spam(): pass

## Header 2

顺便说一下,这就是 Markdown 解析器不提供“白名单”选项的原因。结果永远不是那些想要选择权的人所期望的。

全面披露:我是 Python-Markdown 项目的首席开发人员。

关于python - 我可以在 Python Markdown 中将标签列入白名单吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558698/

25 4 0