从reStructuredText中提取字段列表

Mar*_*ing 6 python restructuredtext docutils

假设我有以下reST输入:

Some text ...

:foo: bar

Some text ...
Run Code Online (Sandbox Code Playgroud)

我想最终得到的是这样一个字典:

{"foo": "bar"}
Run Code Online (Sandbox Code Playgroud)

我试着用这个:

tree = docutils.core.publish_parts(text)
Run Code Online (Sandbox Code Playgroud)

它确实解析了字段列表,但我最终得到了一些伪XML tree["whole"]?:

<document source="<string>">
    <docinfo>
        <field>
            <field_name>
                foo
            <field_body>
                <paragraph>
                    bar
Run Code Online (Sandbox Code Playgroud)

由于treedict不包含任何其他有用的信息,而且只是一个字符串,我不知道如何解析reST文档中的字段列表.我该怎么办?

Chr*_*ris 7

您可以尝试使用类似下面的代码.而不是使用publish_parts我使用的方法publish_doctree,以获取文档的伪XML表示.然后我转换为XML DOM以提取所有field元素.然后我得到每个元素的第一个field_namefield_body元素field.

from docutils.core import publish_doctree

source = """Some text ...

:foo: bar

Some text ...
"""

# Parse reStructuredText input, returning the Docutils doctree as
# an `xml.dom.minidom.Document` instance.
doctree = publish_doctree(source).asdom()

# Get all field lists in the document.
fields = doctree.getElementsByTagName('field')

d = {}

for field in fields:
    # I am assuming that `getElementsByTagName` only returns one element.
    field_name = field.getElementsByTagName('field_name')[0]
    field_body = field.getElementsByTagName('field_body')[0]

    d[field_name.firstChild.nodeValue] = \
        " ".join(c.firstChild.nodeValue for c in field_body.childNodes)

print d # Prints {u'foo': u'bar'}
Run Code Online (Sandbox Code Playgroud)

xml.dom的模块是不是最简单的一起工作(为什么我需要使用.firstChild.nodeValue,而不是仅仅.nodeValue例如),所以你可能希望使用xml.etree.ElementTree模块,我找了很多容易的工作.如果您使用LXML你也可以使用XPath表示法来找到所有的field,field_namefield_body元素.