2016-12-01 3 views
1

In einem meiner Skripts verwende ich urllib2 und BeautifulSoup, um eine HTML-Seite zu analysieren und ein <script>-Tag zu lesen. DieseParsing Javascript mit Python

ist, was ich bekommen:

<script> 
var x_data = { 
    logged: logged, 
    lengthcarrousel: 2, 
    products : [ 
     { 
      "serial" : "106541823" 
      ... 
</script> 

Mein Ziel ist es, die JSON in der x_data Variable zu lesen, und ich weiß nicht, wie es richtig zu machen. ich allerdings aus:

  • Umrechnen in String und entfernen Sie die ersten Zeichen an den {und gleich für last}
  • Reguläre Ausdrücke verwenden mit so etwas wie und nehmen Sie die erste Gruppe
  • '{*.} Etwas anderes ?

Ich weiß nicht, ob diese effizient sind und ob es andere Möglichkeiten gibt, es auf eine nette Art und Weise zu tun.

Denken Sie, dass eine Methode der anderen vorzuziehen ist? jede Methode, die mir nicht bewusst ist?

Vielen Dank im Voraus für einen Rat.

EDIT:

Nach Beratung erhalte ich die Regexp Lösung, aber ich kann trotz Anwendung re.MULTILINE in mehreren Zeilen suchen:

string1 = '<script> 
var x_data = { 
    logged: logged, 
    lengthcarrousel: 2, 
    products : [ 
     { 
       "serial" : "106541823"} 
] 
}; 
</script>' 


p = re.compile(r'\{.*\};',re.MULTILINE); 
m = p.search(string1) 
if m: 
    print m.group(0) 
else: 
    print "Error !" 

ich einen immer bekam "Fehler!".

EDIT2:

funktioniert gut mit re.DOTALL.

+0

https://pypi.org/project/jsonfinder/ –

+0

Hängt davon ab, wie die Eingabe variiert. Wenn es immer 'var x_data = ...' sein soll, kannst du das Bit, das am Anfang der Zeichenfolge verankert ist, einfach regex ersetzen. Ihre Lösung könnte irgendwo zwischen so einfach wie so kompliziert wie das Einbetten eines JS-Parsers liegen. –

+0

Hallo, es wird immer 'var x_data = ...' sein. Danke, ich schreibe gerade die regexp-Lösung. –

Antwort

2

denke ich, diese Verfahren im Wesentlichen die gleichen sind in Bezug auf Eleganz und Leistung ({.*} mit etwas besser sein können, weil .* gierig ist, also wird es so gut wie keine Rückzieher sein, und da scheint es mir mehr „nachsichtig“ für verschiedene JS-Code-Formatierungsnuancen). Was Sie vielleicht mehr interessiert, ist dies: https://docs.python.org/3.6/library/json.html.

1

Wenn es immer genau so aussieht, dann können Sie eine Lösung wie die, die Sie vorgeschlagen haben, hacken, da sie genau so aussieht.

Weil Programmierer alles im Code machen, vermute ich in der Praxis wird es nicht immer genau das aussehen, und dann wird jede Hacky-Lösung zerbrechlich sein und wird bei unerwarteten ("unmöglich" unbequemen) Momenten versagen. (Regex ist bekanntermaßen Hacky, wenn es um das Parsen von Code geht).

Wenn Sie dies richtig machen möchten, müssen Sie einen echten JavaScript-Parser abrufen, ihn auf das durch den Skript-Tag-Inhalt definierte Codefragment anwenden, um einen AST zu erzeugen, und dann nach verschachtelten AST-Strukturen suchen wie JSON aussehen und den Inhalt dieses Baumes hübsch drucken.

Auch das wird angesichts eines Programmierers fragil, der das JSON-Fragment mithilfe von JavaScript-Zuweisungsanweisungen zusammensetzt. Sie können damit umgehen, indem Sie den Datenfluss berechnen und Code-Sätze ermitteln, die beim Zusammensetzen von JSON-Code vorkommen. Das ist ziemlich viel Arbeit.

So können Sie entscheiden, was die Grenzen für Ihre Lösung sein werden, und dann die Konsequenzen akzeptieren, wenn jemand, den Sie nicht kontrollieren, etwas zufälliges tut.

+0

Wow. Ein Downvote. Downvoter, sind Sie bereit, Ihren Grund für die Ablehnung zu erklären, und insbesondere, warum diese Antwort nicht korrekt ist? –

+0

Ich habe nicht downvote, aber nehme an, dass, wenn "es wird immer' var x_data = .... '" (http://stackoverflow.com/questions/40915646/parsing-javascript-with-python/40915808#comment69043750_40915646) dann sollte die Code-Struktur ziemlich fest sein. –

+0

Das ist für OP zu behaupten und zu erzwingen, soweit er es kann. Wenn er das wirklich durchsetzen kann, dann kann er sicher abhacken. Ich denke, es ist eine sehr schlechte Wette. Meine Erfahrung mit Leuten, die mir sagen, dass ihr gesamter Code nach einem bestimmten Stil geschrieben ist, ist, dass die Leute, die mir sagen, nicht die sind, die den Code geschrieben haben, und sie belügen sich selbst und mir und werden mich leiden lassen entpuppt sich als falsch. Und ich habe hier viel Erfahrung. –