【问题标题】:parse reStructuredText README.rst to get description section解析 reStructuredText README.rst 以获取描述部分
【发布时间】:2013-07-26 20:17:50
【问题描述】:

我试图在 setup.py 的包描述中重用我的 README.rst 中的信息

在我的 setup.py 中有一个自述文件功能:

def readme():
    try:
        with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
            return f.read()
    except (IOError, OSError):
        return ''

我调用的

setup(
    ...
    long_description=readme(),
    ...
)

因为我的reStructuredText 是一个相当大的README.rst,所以只阅读重组文本的特定部分可能是一种更好的方法。

是否有一种聪明的方法来重写 readme() 以便它解析 README.rst 并忽略其余的 reStructuredText 格式,即只给出一小部分的纯文本?

【问题讨论】:

  • 现在正在研究 reStructuredText 解析。如果我能弄清楚 - 将发布答案。
  • 试试DocUtils。它是 Sphinx 中使用的 rST 解析器。

标签: python packaging setuptools restructuredtext


【解决方案1】:

我最终得到了这个,这并不完美,但可以完成工作:

def readme():
    try:
        import docutils
    except ImportError:
        try:
            with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
                return f.read()
        except (IOError, OSError):
            return ''
    with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
        document = docutils.core.publish_doctree(f.read())
        nodes = list(document)
        description = ''
        for node in nodes:
            if str(node).startswith('<topic classes="contents"'):
                break
            if type(node) is docutils.nodes.comment\
            or type(node) is docutils.nodes.title:
                continue
            description += node.astext() + '\n'
        return  return description.encode('ascii', 'ignore').strip()

我想人们可以通过遍历 rST 文档树来进行更好、更复杂的解析。

【讨论】:

    【解决方案2】:

    我认为您可以使用 DocUtils 的这一部分:

    "解析文档

    解析器分析输入文档并创建节点树 表示。在这种情况下,我们使用 reStructuredText 解析器 (docutils/parsers/rst/init.py)。查看该节点树的外观 比如,我们调用 quicktest.py (可以在 tools/ 目录中找到 Docutils 发行版的) 与我们的示例文件 (test.txt) 作为 第一个参数(Windows 用户可能需要键入 python quicktest.py test.txt):

    $ quicktest.py test.txt 我的 最喜欢的 语言是 Python . 现在让我们检查节点树:

    顶级节点是文档。它有一个源属性,其值 是文本.txt。有两个孩子:一个段落节点和一个目标 节点。该段落又具有子节点:一个文本节点(“我的”),一个 强调节点、文本节点(“语言是”)、参考节点和 又是一个文本节点(“.”)。

    这些节点类型(文档、段落、强调等)都是定义好的 在 docutils/nodes.py 中。节点类型在内部排列为 类层次结构(例如,强调和引用都具有 通用超类内联)。获取节点类的概览 层次结构,使用 epydoc(键入 epydoc nodes.py)并查看类 层次结构树。” --http://docutils.sourceforge.net/docs/dev/hacking.html

    只找到整个文档中您需要的节点 :) 然后只写相关的节点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多