2012-10-14 13 views
12

Gibt es ein Modul, das restructuredtext in ein Baummodell parsen kann?Wie man restrukturierten Text in Python analysieren?

Können Docutils oder Sphinx das tun?

+1

"Was ist besser" fragt nach Meinung, also habe ich es von der Frage entfernt. –

+0

Was meinen Sie mit restrukturiertem Text? –

+1

@IonutHulub http://docutils.sourceforge.net/rst.html –

Antwort

15

Docutils enthält tatsächlich die Tools, um dies zu tun.

Was Sie wahrscheinlich wollen, ist der Parser bei docutils.parsers.rst

Siehe this page für Details was beteiligt ist. Es gibt auch einige Beispiele unter docutils/examples.py - insbesondere die internals() Funktion, die wahrscheinlich von Interesse ist.

+1

Um nur hinzuzufügen, dass Docutils die Referenzimplementierung von reStructuredText ist und dass Sphinx auf Docutils aufgebaut ist. Also, Docutils ist definitiv das richtige Werkzeug dafür. – Chris

1

Ich möchte auf die Antwort von Gareth Latty erweitern. "Was Sie wahrscheinlich wollen, ist der Parser bei docutils.parsers.rst" ist ein guter Ausgangspunkt der Antwort, aber was kommt als nächstes? Nämlich:

Wie restructuredtext in Python zu analysieren?

Im Folgenden finden Sie die genaue Antwort für Python 3.6 und docutils 0,14:

import docutils.nodes 
import docutils.parsers.rst 
import docutils.utils 

def parse_rst(text: str) -> docutils.nodes.document: 
    parser = docutils.parsers.rst.Parser() 
    components = (docutils.parsers.rst.Parser,) 
    settings = docutils.frontend.OptionParser(components=components).get_default_values() 
    document = docutils.utils.new_document('<rst-doc>', settings=settings) 
    parser.parse(text, document) 
    return document 

und das resultierende Dokument kann unter Verwendung verarbeitet werden, beispielsweise unter, die alle Hinweise auf das Dokument gedruckt wird:

class MyVisitor(docutils.nodes.NodeVisitor): 

    def visit_reference(self, node: docutils.nodes.reference) -> None: 
     """Called for "reference" nodes.""" 
     print(node) 

    def unknown_visit(self, node: docutils.nodes.Node) -> None: 
     """Called for all other node types.""" 
     pass 

Hier ist, wie es laufen:

doc = parse_rst('spam spam lovely spam') 
visitor = MyVisitor(doc) 
doc.walk(visitor)