gpt4 book ai didi

python - 使用 Python markdown Treeprocessor 包装 etree 元素

转载 作者:行者123 更新时间:2023-12-01 06:53:45 25 4
gpt4 key购买 nike

我正在尝试编写一个 Python markdown Treeprocessor 扩展,它将把 span 标签包装在 div 标签内;所以如果我有( Markdown )-

before <span>hello world</span> after

然后进行后处理,我想最终得到 -

before <div><span>hello world</span></div> after

Python markdown 似乎拥有所有这些不同的处理器,您可以使用和扩展 -

https://python-markdown.github.io/extensions/api/

我认为 TreeProcessor 可能是最合适的,并提出了以下方案 -

from markdown.extensions import Extension

from markdown.treeprocessors import Treeprocessor

import markdown

class MyTreeProcessor(Treeprocessor):

def run(self, doc):
def iterate(parent):
print ("%s %s :: %s" % (parent.tag, parent.attrib, parent.text))
for child in parent.getchildren():
iterate(child)
iterate(doc)

class MyTreeExtension(Extension):

def extendMarkdown(self,
md,
key="my_extension",
index=1e8):
md.registerExtension(self)
md.treeprocessors.register(MyTreeProcessor(md.parser),
key, index)

if __name__=="__main__":
md=markdown.Markdown(extensions=[MyTreeExtension()])
md.convert("before <span>hello world</span> after")

但是如果我使用索引值 1e8 运行它,我会得到以下结果 -

div {} :: None
p {} :: before <span>hello world</span> after

如果我使用索引值 0 运行它,我会得到以下结果 -

div {} :: 

p {} :: before wzxhzdk:0hello worldwzxhzdk:1 after

这两个都不是我想要的 - 在第一种情况下 span 尚未被处理,在第二种情况下它已以某种奇怪的格式处理:-/

找到 markdown 扩展文档对于看似简单的任务来说非常夸张 - 有人可以确认我在这里使用 Treeprocessor 是在正确的树上(或不是),如果是这样,我做错了什么无法将此 span 解析为 etree.Element

TIA

最佳答案

您可能不想在此处使用 Treeprocessor,因为您正在处理原始 HTML。

Python-Markdown 通过将 Markdown 转换为 etree 来解析它目的。但是,它不解析 HTML(至少不完全解析)和 etree对象不能保存原始 HTML 字符串。好吧,他们可以捕获他们,但是当 etree 时他们会逃脱。对象被渲染为 HTML 字符串。因此,原始 HTML 被识别并替换为占位符 ( wzxhzdk:0 )。之后etree对象被渲染为 HTML 字符串,后处理器然后找到所有占位符并将它们交换为使用占位符作为键存储的原始 HTML。

两个索引之间行为不同的原因是,其中一个索引在内联模式运行之前运行(第一个树处理器实际上是所有内联模式的包装器),另一个索引在之后运行,但在占位符交换回来之前运行当然,由于占位符由后处理器换回,因此您无法从树预处理器访问该状态。

总结:

  1. block 级原始 HTML 由预处理器处理,并且永远无法从树处理器中获得。
  2. 内联原始 HTML 由内联模式处理,因此内联原始 HTML 在 inlineProcessor 之前将不会被处理。树处理器运行,但运行后将无法从树处理器中获取。

一个可能的解决方案是使用内联模式。但是,您需要自己解析 HTML 标记。

此外,您想要的输出不是有效的 HTML。请注意before <span>hello world</span> after会被包裹在 <p> 中标签和<p>标签不能包含任何其他 block 级元素,包括 <div>标签。当然,没有什么强制您不包装 <div>标签 <p>标签,但浏览器永远不会以这种方式解释 HTML。根据 HTML 规范, block 级标签会自动关闭 <p>标签。因此,浏览器(可能)会像这样解释您的输出:

<p>before </p><div><span>hello world</span></div> after<p></p>

请注意,没有 <p>包装after 。是的,结束标签会出现,但没有开始标签(紧接在结束 </div> 之后,浏览器不知道它是否启动,并且您会在寡妇结束标签所在的位置得到一个空 <p>

现在,如果您对这一切都满意,那么为什么不直接使用 <div>首先在你的 Markdown 中。或者是<span><div>只是问题中现实生活中实际标签的占位符?如果是这样,无论它们是内联级还是 block 级都可能改变答案。

关于python - 使用 Python markdown Treeprocessor 包装 etree 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58893400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com