6
votes

Extraire la liste de champ de restructurétext

Dis que j'ai l'entrée de repos suivante: xxx

Ce que je voudrais finir avec est un dict comme celui-ci: xxx

J'ai essayé d'utiliser ceci: xxx

Il analyse la liste de champs, mais je me retrouve avec un pseudo xml dans arbre ["tout"]? : xxx

puisque l'arborescence dict ne contient aucune autre information utile et qui est juste une chaîne, je ne sais pas comment analyser la liste de terrain hors du document de repos. Comment ferais-je cela?


0 commentaires

3 Réponses :


7
votes

Vous pouvez essayer d'utiliser quelque chose comme le code suivant. Plutôt que d'utiliser la méthode Publish_parts Code> J'ai utilisé Publish_doctree , pour obtenir la représentation pseudo-xml de votre document. J'ai ensuite converti en XML DOM afin d'extraire tous les éléments code> code>. Ensuite, j'obtiens le premier field_name code> et champs_body code> éléments de chaque champ code> élément.

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'}


1 commentaires

Merci, ça ressemble à ce que je cherche!



0
votes

J'ai une solution alternative que je trouve moins un fardeau, mais peut-être plus fragile. Après avoir examiné la mise en œuvre de la classe nœud https: / /sourceforge.net/p/docutils/code/head/tree/trunk/docutils/docutils/nodes.py Vous verrez qu'il prend en charge une méthode de marche pouvant être utilisée pour retirer les données souhaitées sans avoir à Créez deux représentations XML différentes de vos données. Voici ce que j'utilise maintenant, dans mon code protoype:

https://github.com/h4ck3rm1k3/gcc-introspector/blob/master/peewee_Adaptor.py#l33 xxx

puis < Pré> xxx


0 commentaires

0
votes

Voici mon EMPLOYTREE Mise en œuvre:

>>> next(gen_fields(source))
{'foo': 'bar'}


0 commentaires