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文档中的字段列表.我该怎么办?
您可以尝试使用类似下面的代码.而不是使用publish_parts我使用的方法publish_doctree,以获取文档的伪XML表示.然后我转换为XML DOM以提取所有field元素.然后我得到每个元素的第一个field_name和field_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_name和field_body元素.
| 归档时间: |
|
| 查看次数: |
1101 次 |
| 最近记录: |