Ich brauche rekursiv gehen eine JSON-Dateien (post Antworten von einer API) Trog, die Saiten zu extrahieren, die haben [ „text“] als Schlüssel {"text":"this is a string"}
rekursive Spaziergang durch eine JSON-Datei ausgewählt Strings extrahiert
Ich muß Beginnen Sie mit der Analyse der Quelle, die das älteste Datum in den Metadaten hat, extrahieren Sie die Zeichenfolgen aus dieser Quelle, und wechseln Sie dann zur zweitältesten Quelle und so weiter. Die JSON-Datei könnte schlecht verschachtelt sein, und die Ebene, auf der sich die Zeichenfolgen befinden, kann sich von Zeit zu Zeit ändern.
Problem: Es gibt viele Schlüssel namens ["Text"] und ich brauche nicht alle von ihnen, ich brauche nur diejenigen, die Werte als Zeichenfolge haben. Besser, der "text": "string" brauche ich IMMER im selben Objekt {} einer "type":"sentence"
. Siehe Bild.
Was ich frage
Ändern Sie den zweiten Code unten, um rekursiv die Datei zu gehen und extrahieren nur die [ „text“] Werte, wenn sie im selben Objekt sind {} zusammen mit „type“:“ Satz".
Im Folgenden ein Ausschnitt aus JSON-Datei (in grün der Text, den ich und die medatada benötigen, in rot die, die ich nicht brauchen, um zu extrahieren): http://pastebin.com/0NS5BiDk:
Link zum vollständigen JSON Probe
Was ich bisher getan haben:
1) Der einfache Weg: verwandle die jSON-Datei in String und die Suche nach Inhalt zwischen den doppelten Anführungszeichen („“), weil in allen json Beitrag Antworten die „Strings“ I Notwendigkeit sind die nur solche, die zwischen doppelten Anführungszeichen stehen. Diese Option verhindert jedoch, dass ich die Ressourcen vorher bestellen kann, ist also nicht gut genug.
r1 = s.post(url2, data=payload1)
j = str(r1.json())
sentences_list = (re.findall(r'\"(.+?)\"', j))
numentries = 0
for sentences in sentences_list:
numentries += 1
print(sentences)
print(numentries)
2) Smarter Weg: gehen rekursiv eine JSON-Datei Trog und Dekomprimierung der [ "text"] Werte
def get_all(myjson, key):
if type(myjson) is dict:
for jsonkey in (myjson):
if type(myjson[jsonkey]) in (list, dict):
get_all(myjson[jsonkey], key)
elif jsonkey == key:
print (myjson[jsonkey])
elif type(myjson) is list:
for item in myjson:
if type(item) in (list, dict):
get_all(item, key)
print(get_all(r1.json(), "text"))
Es extrahiert alle Werte, die [ "text"] als Key haben. Leider gibt es in der Datei andere Sachen (die ich nicht brauche), die ["text"] als Key haben. Daher gibt es Text zurück, den ich nicht brauche.
Bitte beraten.
UPDATE
I 2 Codes geschrieben haben, um die Liste der Objekte, die von einem bestimmten Schlüssel zu sortieren. Der erste sortiert nach dem 'Text' des XML. Der zweite Wert nach dem Wert "Zeitraum enthalten von".
Die erste funktioniert, aber ein paar der XMLs, auch wenn sie in der Anzahl höher sind, haben tatsächlich Dokumente in älter als ich erwartet hatte.
Für den 2. Code ist das Format von 'Zeitraum von enthalten' nicht konsistent und manchmal ist der Wert überhaupt nicht vorhanden. Der zweite gibt mir auch einen Fehler, aber ich kann nicht herausfinden, warum - string indices must be integers
.
# 1st code (it works but not ideal)
j=r1.json()
list = []
for row in j["tree"]["children"][0]["children"]:
list.append(row)
newlist = sorted(list, key=lambda k: k['text'][-9:])
print(newlist)
# 2nd code I need something to expect missing values and to solve the
# list index error
list = []
for row in j["tree"]["children"][0]["children"]:
list.append(row)
def date(key):
return dparser.parse((' '.join(key.split(' ')[-3:])),fuzzy=True)
def order(list_to_order):
try:
return sorted(list_to_order,
key=lambda k: k[date(["metadata"][0]["value"])])
except ValueError:
return 0
print(order(list))
Bitte bearbeiten Sie Ihre Frage und fügen Sie ein Beispiel von JSON ein, das als Text geparst werden soll - nur ein Screenshot ist nicht genug. – martineau
@martineau, ist es nicht genug das Bild, das ich bereits geladen habe? Ich bin mir nicht sicher, ob ich Ihre Anfrage verstehe, tut mir leid. bitte erkläre. BTW Ich benutze Python 3.5 – ganesa75
@martineau, wie kann ich die gesamte JSON-Datei laden? – ganesa75