微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 举报,一经查实,本站将立刻删除。