说我有以下reST输入:
Some text ... :foo: bar Some text ...
我最终想得到的是这样的字典:
{"foo": "bar"}
我试图用这个:
tree = docutils.core.publish_parts(text)
它确实解析了字段列表,但是我最终得到了一些伪XML tree["whole"]?:
tree["whole"]?
<document source="<string>"> <docinfo> <field> <field_name> foo <field_body> <paragraph> bar
由于treedict不包含任何其他有用的信息,而仅仅是一个字符串,因此我不确定如何从reST文档中解析出字段列表。我该怎么办?
tree
您可以尝试使用类似以下代码的内容。而不是使用publish_parts我曾经使用过的方法publish_doctree来获取文档的伪XML表示形式。然后,我已转换为XML DOM,以提取所有field元素。然后我得到每个元素的第一个field_name和field_body元素field。
publish_parts
publish_doctree
field
field_name
field_body
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'}
该xml.dom的模块是不是最容易与工作(为什么我需要使用.firstChild.nodeValue,而不是仅仅.nodeValue例如),所以你可能希望使用xml.etree.ElementTree模块,我觉得轻松了许多与工作。如果您使用LXML你也可以使用XPath表示法来找到所有的field,field_name和field_body元素。
.firstChild.nodeValue
.nodeValue