2017-03-19 6 views
0

noch lernen Python. Ich arbeite derzeit an einem Python-Code, der Metadaten (usermade Keywords) aus Bildern extrahiert. Ich habe bereits Pillow AND exif ausprobiert, aber dies schließt die vom Benutzer erstellten Tags oder Schlüsselwörter aus. Mit applist konnte ich die Metadatei einschließlich meiner Schlüsselwörter erfolgreich extrahieren, aber als ich versuchte, sie mit ElementTree zu extrahieren, um die Teile von Interesse zu extrahieren, erhalte ich nur leere Daten.Schlüsselwörter extrahieren Form Bilder mit Python

Meine XML-Datei sieht wie folgt aus (nach einiger Manipulation):

<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0"> 
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
     <rdf:Description rdf:about="" 
      xmlns:dc="http://purl.org/dc/elements/1.1/"> 
     <dc:description> 
      <rdf:Seq> 
       <rdf:li xml:lang="x-default">South Carolina, Olivyana, Kumasi</rdf:li> 
      </rdf:Seq> 
     </dc:description> 
     <dc:subject> 
      <rdf:Bag> 
       <rdf:li>Kumasi</rdf:li> 
       <rdf:li>Summer 2016</rdf:li> 
       <rdf:li>Charlestone</rdf:li> 
       <rdf:li>SC</rdf:li> 
       <rdf:li>Beach</rdf:li> 
       <rdf:li>Olivjana</rdf:li> 
      </rdf:Bag> 
     </dc:subject> 
     <dc:title> 
      <rdf:Seq> 
       <rdf:li xml:lang="x-default">P1050365</rdf:li> 
      </rdf:Seq> 
     </dc:title> 
     </rdf:Description> 
     <rdf:Description rdf:about="" 
      xmlns:aux="http://ns.adobe.com/exif/1.0/aux/"> 
     <aux:SerialNumber>F360908190331</aux:SerialNumber> 
     </rdf:Description> 
    </rdf:RDF> 
</x:xmpmeta> 

Mein Code sieht wie folgt aus:

import xml.etree.ElementTree as ET 
from PIL import Image, ExifTags 
with Image.open("myfile.jpg") as im: 
    for segment, content in im.applist: 
     marker, body = content.split(b'\x00', 1) 
     if segment == 'APP1' and marker == b'http://ns.adobe.com/xap/1.0/': 
      data = body.decode('"utf-8"') 
print (data) 

an dieser Stelle ist es möglich was't passieren diese an den Parser da es eine leere Zeile einen Fehler zurückgegeben:

tree = ET.parse(data) 

ValueError: embedded null byte 

so nach dem Entfernen wir die Daten in einer xML-Datei gespeichert (th XML-Daten e oben) und an den Parser übergeben, aber keine Daten zu erhalten:

tree = ET.parse('mytags.xml') 
tags = tree.findall('xmpmeta/RDF/Description/subject/Bags') 
print (type(tags)) 
print (len(tags)) 

<class 'list'> 
0 

Interessanterweise habe ich die Tags in der Form der XML-Datei (d.h. 'x: xmpmeta' :), ich erhalte den folgenden Fehler:

SyntaxError: prefix 'x' not found in prefix map 

Vielen Dank für Ihre Hilfe.

Fabio

+0

Was ist es genau, dass Sie als Ausgang wollen? –

+0

Es sollte möglich sein, mit ElementTree zu parsen, also poste bitte den Code, der nicht funktioniert hat. –

+0

Codes hinzugefügt, es gab eine Reihe kleiner Probleme, die ich auch beheben wollte. Ich bin an den Tags rdf: li> interessiert. –

Antwort

0

Fokussierung nur auf XML-Arbeit nicht PIL Metadaten Parsen sind drei Themen, die Ihr Problem:

  1. Sie müssen die Namespacepräfixe definieren, wenn findall mit dem Sie mit den Namensraum tun können arg. Und dann muss Ihr xpath die Präfixe enthalten.
  2. Bei Verwendung von findall nicht die Wurzel als das ist der Ausgangspunkt, sondern von seinem Kind nach unten.
  3. Es gibt keine Taschen lokalen Namen mit Plural aber nur Tasche und seine Länge wäre eins. Wenn Sie seine Kinder wollen, gehen Sie eine Ebene tiefer.

bereinigtes Skript vor:

import xml.etree.ElementTree as ET 

tree = ET.parse('mytags.xml') 

nmspdict = {'x':'adobe:ns:meta/',    
      'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 
      'dc': 'http://purl.org/dc/elements/1.1/'} 

tags = tree.findall('rdf:RDF/rdf:Description/dc:subject/rdf:Bag/rdf:li', 
        namespaces = nmspdict) 

print (type(tags)) 
print (len(tags)) 

# <class 'list'> 
# 6 

for i in tags: 
    print(i.text) 
# Kumasi 
# Summer 2016 
# Charlestone 
# SC 
# Beach 
# Olivjana 
+0

Hallo, vielen Dank für die Hilfe und Entschuldigung für das Rechtschreibfehler. Ich habe versucht, über die Liste zu springen, die erstellt wurde, um die Tags zu extrahieren, aber den folgenden Fehler erhalten: AttributeError: 'NoneType' -Objekt hat kein Attribut 'text' –

+0

Nicht ganz sicher, was Sie ausprobiert, aber ich aktualisiert mit einer Schleife Iteration. – Parfait

Verwandte Themen