有没有可以将重构文本解析为树形模型的模块?
docutils或sphinx能否完成此任务?
有没有可以将重构文本解析为树形模型的模块?
docutils或sphinx能否完成此任务?
我想在Gareth Latty的答案基础上进一步扩展。 "你可能想要的是docutils.parsers.rst
解析器"是答案的一个好的起点,但接下来呢?即:
如何在Python中解析重构文本?
以下是针对Python 3.6和docutils 0.14的确切答案:
import docutils.nodes
import docutils.parsers.rst
import docutils.utils
import docutils.frontend
def parse_rst(text: str) -> docutils.nodes.document:
parser = docutils.parsers.rst.Parser()
components = (docutils.parsers.rst.Parser,)
settings = docutils.frontend.OptionParser(components=components).get_default_values()
document = docutils.utils.new_document('<rst-doc>', settings=settings)
parser.parse(text, document)
return document
然后可以使用以下方式处理生成的文档,例如下面的方法,它将打印文档中的所有参考文献:
And the resulting document can be processed using, for example, below, which will print all references in the document:class MyVisitor(docutils.nodes.NodeVisitor):
def visit_reference(self, node: docutils.nodes.reference) -> None:
"""Called for "reference" nodes."""
print(node)
def unknown_visit(self, node: docutils.nodes.Node) -> None:
"""Called for all other node types."""
pass
以下是运行它的方法:
doc = parse_rst('spam spam lovely spam')
visitor = MyVisitor(doc)
doc.walk(visitor)
docutils.core
提供的“发布者便利函数”(https://docutils.sourceforge.io/docs/api/publisher.html#publisher-convenience-functions)。 - undefinedDocutils确实包含了完成此操作所需的工具。
您可能需要的是docutils.parsers.rst
中的解析器。
有关涉及内容的详细信息,请参见此页面。还有一些示例在docutils/examples.py
中,尤其是要查看internals()
函数,这可能会引起您的兴趣。
基于 Gareth Latty 和 mbdevpl 在此的答案,这是 docutils 新版本的更新。
从 docutils 0.18(2021-10-26)开始,docutils.frontend.OptionParser
已被弃用(git镜像提交} },{{link2:上游SVN HISTORY.txt ),并且将打印以下警告(source):
DeprecationWarning: The frontend.OptionParser class will be replaced by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
docutils.frontend.get_default_settings()
函数可用于此目的,但它仅在docutils 0.18中添加,为了兼容所有版本且不出现警告,您可以使用:
import docutils.parsers.rst
import docutils.utils
import docutils.frontend
def parse_rst(text: str) -> docutils.nodes.document:
parser = docutils.parsers.rst.Parser()
if hasattr(docutils.frontend, 'get_default_settings'):
# docutils >= 0.18
settings = docutils.frontend.get_default_settings(docutils.parsers.rst.Parser)
else:
# docutils < 0.18
settings = docutils.frontend.OptionParser(components=(docutils.parsers.rst.Parser,)).get_default_values()
document = docutils.utils.new_document('<rst-doc>', settings=settings)
parser.parse(text, document)
return document
代码的其余部分保持不变,可以在mbdevpl的答案中找到。
在 docutils.core
模块中有一个更高级别的 Docutils 接口。要将一串 reStructuredText 解析成文档树,请执行以下操作:
from docutils.core import publish_doctree
source = 'Hello *world*'
tree = publish_doctree(source)
详情请参见https://docutils.sourceforge.io/docs/api/publisher.html