如何使用 Python 的 docutils 来解析像树一样的 RST 文档?

问题描述

从本网站的不同答案中,我编写/复制了以下代码来解析 RST 文档。

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

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

def myparse():
    s = ''
    with open('test.rst') as f:
        s = f.read()
    doc = parse_rst(s)
    visitor = MyVisitor(doc)
    return doc,visitor

代码有效并且能够解析 RST 文档。如果我有一个像下面这样的 RST 文档

heading1
========
and some
multi line text

subheading1
-----------

afjafjafjfjajf

heading2
========
other text

我希望得到一个树状结构,其中主要标题一个级别上,每个标题都是一个节点,我可以使用它在树中递归到其子标题和子标题。相反,我得到了一个完全线性的结构,其中副标题似乎与更高级别的标题处于同一级别。这是 doc.ids 的输出

>>> doc,vis = myparse()
>>> doc.ids
{'heading1': <section "heading1": <title...><paragraph...><section "subheading1"...>>,'subheading1': <section "subheading1": <title...><paragraph...>>,'heading2': <section "heading2": <title...><paragraph...>>}

所以,我对如何以编程方式迭代顶级标题有点不知所措。如果有的话,使用 docutils 像树一样导航文档的正确方法是什么,以便我可以轻松确定哪些副标题属于适当的标题,并避免在尝试查找主要的顶级标题时迭代副标题

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)