如何在python中解析restructuredtext?

zha*_*lin 19 python parsing dom restructuredtext

是否有任何模块可以将重构文本解析为树模型?

docutils或sphinx可以这样做吗?

Gar*_*tty 17

Docutils确实包含了执行此操作的工具.

你可能想要的是解析器 docutils.parsers.rst

有关所涉及的详细信息,请参阅此页面.还有一些例子docutils/examples.py- 特别是检查internals()功能,这可能是有意义的.

  • 只是补充一点,Docutils是reStructuredText的参考实现,而Sphinx是建立在Docutils之上的.所以,是的,Docutils绝对是正确的工具. (4认同)

mbd*_*vpl 16

我想扩展Gareth Latty的答案."你可能想要的是解析器docutils.parsers.rst"是答案的一个很好的起点,但下一步是什么?即:

如何在python中解析restructuredtext?

下面是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
Run Code Online (Sandbox Code Playgroud)

并且可以使用例如下面的处理来处理结果文档,这将打印文档中的所有引用:

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
Run Code Online (Sandbox Code Playgroud)

以下是如何运行它:

doc = parse_rst('spam spam lovely spam')
visitor = MyVisitor(doc)
doc.walk(visitor)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供代码示例!讽刺的是,docutils 的文档是我尝试过的所有库中最差的(不过至少它*有*文档)。 (4认同)