python - 如何使用 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 的正确方法是什么(如果有的话)像树一样导航文档,以便我可以轻松确定哪些子标题属于适当的标题,并避免在尝试查找我的主要顶级标题时迭代子标题?
解决方案
推荐阅读
- javascript - 使用 .includes 查找数字中的数字是否与不同数字中的相同数字(例如 21 和 12)
- django - 在 DRF 中,如何正确显示一个模型内部的相关名称字段?
- azure - Azure Java SDK - 无法添加资源锁
- arrays - 等待循环完成,DispatchGroup 使用 Swift 从 firebase 获取数据
- python-3.x - 在索引时在熊猫对象上使用拆分会给出关键错误
- javascript - 我只想从我自己的组件中的他自己的按钮显示下拉菜单,该组件已在 React Native 中使用数组映射方法循环
- php - 如何在不修改预先存在和标签的情况下用超链接替换特定文本?
- c# - 通过单个元素在集合中通过 wpf datagrid 更新属性
- javascript - 如何小写一个特定的字母?
- java - 正则表达式在第二个斜杠和=之后提取字符串在java中