xml (nfo) to txt parser

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • xml (nfo) to txt parser

      Hallo zusammen,

      ich habe vor geraumer zeit ein script gebastelt, dass informationen aus .nfo dateien (tiny media manager) ausliest und in für emc lesbare txt dateien speichert.
      das funktionierte bisher auch immer ganz gut aber ich bekomme mittlerweile am ende der programmausführung (das script macht nach wie vor alles was es soll) einen fehler.

      aufgerufen wird das python-sript mit folgendem sh-script:
      Display Spoiler


      #!/bin/bash
      cd /hdd/movie/Filme/wasndas
      while IFS= read -r -d '' desc; do python parser.py "$desc"; done < <(find . -type f -name '*.nfo' -print0)
      echo "fertig :)"


      das python-script selber sieht so aus
      Display Spoiler


      #!/usr/bin/python
      # coding: utf-8
      import io, os, sys
      import xml.etree.ElementTree as ElementTree


      for filename in sys.argv[1:]:
      if os.path.exists(filename):
      doc = ElementTree.parse(filename)


      if doc.find('title') is None:
      title = "Kein Titel"
      print "title fehlt in %s" % filename
      else:
      title = doc.find('title').text or "Kein Titel"


      if doc.find('year') is None:
      year = "Jahr ?"
      print "year fehlt in %s" % filename
      else:
      year = doc.find('year').text or "Jahr ?"


      if doc.find('plot') is None:
      plot = "Keine Inhaltsangabe"
      print "plot fehlt in %s" % filename
      else:
      plot = doc.find('plot').text or "Keine Inhaltsangabe"


      if doc.find('votes') is None:
      votes = "-"
      print "votes fehlt in %s" % filename
      else:
      votes = doc.find('votes').text or "-"


      if doc.find('mpaa') is None:
      mpaa = "?"
      print "mpaa fehlt in %s" % filename
      else:
      mpaa = doc.find('mpaa').text or "?"


      if doc.find('director') is None:
      director = "?"
      print "director fehlt in %s" % filename
      else:
      director = doc.find('director').text or "?"


      if doc.find('runtime') is None:
      runtime = "X"
      print "runtime fehlt in %s" % filename
      else:
      runtime = doc.find('runtime').text or "X"


      if doc.find('rating') is None:
      rating = "-.-"
      print "rating fehlt in %s" % filename
      else:
      rating = doc.find('rating').text


      if rating is None: votes = "-"
      if rating is None: rating = "-.-"
      if mpaa is 'not' or 'rated':
      mpaa = "FSK k.A."


      if doc.find('country') is None:
      country = "Land k.A."
      print "country fehlt in %s" % filename
      else:
      country = doc.find('country').text or "Land k.A."


      if country == "United Kingdom": country = "GB"
      if country == "France": country = "Frankreich"
      if country == "Australia": country = "Australien"
      if country == "Belgium": country = "Belgien"
      if country == "Germany": country = "Deutschland"
      if country == "United States of America": country = "USA"
      if country == "Netherlands": country = "Niederlande"
      if country == "Sweden": country = "Schweden"
      if country == "Canada": country = "Kanada"
      if country == "Colombia": country = "Kolumbien"
      if country == "Spain": country = "Spanien"
      if country == "Argentina": country = "Argentinien"
      if country == "Italy": country = "Italien"
      if country == "Cuba": country = "Kuba"
      if country == "Denmark": country = "D nemark"
      if country == "Czech Republic": country = "Tscheschien"
      if country == "New Zealand": country = "Neuseeland"
      if country == "Russia": country = "Russland"
      if country == "Iceland": country = "Island"


      names = [n.text or "?" for n in doc.findall('actor/name')]
      genre = [g.text or "Genre ?" for g in doc.findall('genre')]


      items = [ title, country + ' ' + year + ' (Bewertung/Stimmen: ' + rating[:3] + '/' + votes + ')' + ' ' + mpaa, runtime + ' min, ' + ', '.join(genre), plot, 'Regie: ' + director, 'Darsteller: ' + ', '.join(names)]


      basename = os.path.splitext(filename)[0]


      with io.open(basename + '.txt', 'w', encoding='utf-8') as fh:
      fh.write(u'\n\n'.join(items))



      und ganz am ende bekomme ich folgenden fehler (wie gesagt, das ergebnis des scripts stimmt)

      Display Spoiler



      Traceback (most recent call last):
      File "parser.py", line 8, in <module>
      doc = ElementTree.parse(filename)
      File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1182, in parse
      tree.parse(source, parser)
      File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 656, in parse
      parser.feed(data)
      File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1642, in feed
      self._raiseerror(v)
      File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
      raise err
      xml.etree.ElementTree.ParseError: syntax error: line 2, column 0



      hat jemand ne idee wie ich das wegbekomme ?
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.

      The post was edited 1 time, last by wsxws ().

    • Ist ja ein Parse-Fehler in einer der XML-Dateien - vielleicht ist die letzte Datei die das Script parsen soll einfach keine XML-Datei? Lass dir einfach noch den Dateinamen mit ausgeben...

      Warum ist das Shell-Script eigentlich so kompliziert? Warum machst du daraus nicht einfach ein


      for f in $(find . -type f -name "*.nfo"); do ./parser.py "$f"; done


      (parser.py ausführbar machen mit chmod +x parser.py, wenn das nicht schon so ist.)

      Und du solltest ein Python-Script unbedingt in einem code-Block und nicht Spoiler posten - vor allem schon wegen der Zeilennummern und erst recht wegen der Einrückung. So wie jetzt ist dein Script mal echt nicht lesbar.

      The post was edited 2 times, last by rdamas ().

    • python:

      Python Source Code: parser.py

      1. #!/usr/bin/python
      2. # coding: utf-8
      3. import io, os, sys
      4. import xml.etree.ElementTree as ElementTree
      5. for filename in sys.argv[1:]:
      6. if os.path.exists(filename):
      7. doc = ElementTree.parse(filename)
      8. if doc.find('title') is None:
      9. title = "Kein Titel"
      10. print "title fehlt in %s" % filename
      11. else:
      12. title = doc.find('title').text or "Kein Titel"
      13. if doc.find('year') is None:
      14. year = "Jahr ?"
      15. print "year fehlt in %s" % filename
      16. else:
      17. year = doc.find('year').text or "Jahr ?"
      18. if doc.find('plot') is None:
      19. plot = "Keine Inhaltsangabe"
      20. print "plot fehlt in %s" % filename
      21. else:
      22. plot = doc.find('plot').text or "Keine Inhaltsangabe"
      23. if doc.find('votes') is None:
      24. votes = "-"
      25. print "votes fehlt in %s" % filename
      26. else:
      27. votes = doc.find('votes').text or "-"
      28. if doc.find('mpaa') is None:
      29. mpaa = "?"
      30. print "mpaa fehlt in %s" % filename
      31. else:
      32. mpaa = doc.find('mpaa').text or "?"
      33. if doc.find('director') is None:
      34. director = "?"
      35. print "director fehlt in %s" % filename
      36. else:
      37. director = doc.find('director').text or "?"
      38. if doc.find('runtime') is None:
      39. runtime = "X"
      40. print "runtime fehlt in %s" % filename
      41. else:
      42. runtime = doc.find('runtime').text or "X"
      43. if doc.find('rating') is None:
      44. rating = "-.-"
      45. print "rating fehlt in %s" % filename
      46. else:
      47. rating = doc.find('rating').text
      48. if rating is None: votes = "-"
      49. if rating is None: rating = "-.-"
      50. if mpaa is 'not' or 'rated':
      51. mpaa = "FSK k.A."
      52. if doc.find('country') is None:
      53. country = "Land k.A."
      54. print "country fehlt in %s" % filename
      55. else:
      56. country = doc.find('country').text or "Land k.A."
      57. if country == "United Kingdom": country = "GB"
      58. if country == "France": country = "Frankreich"
      59. if country == "Australia": country = "Australien"
      60. if country == "Belgium": country = "Belgien"
      61. if country == "Germany": country = "Deutschland"
      62. if country == "United States of America": country = "USA"
      63. if country == "Netherlands": country = "Niederlande"
      64. if country == "Sweden": country = "Schweden"
      65. if country == "Canada": country = "Kanada"
      66. if country == "Colombia": country = "Kolumbien"
      67. if country == "Spain": country = "Spanien"
      68. if country == "Argentina": country = "Argentinien"
      69. if country == "Italy": country = "Italien"
      70. if country == "Cuba": country = "Kuba"
      71. if country == "Denmark": country = "D nemark"
      72. if country == "Czech Republic": country = "Tscheschien"
      73. if country == "New Zealand": country = "Neuseeland"
      74. if country == "Russia": country = "Russland"
      75. if country == "Iceland": country = "Island"
      76. names = [n.text or "?" for n in doc.findall('actor/name')]
      77. genre = [g.text or "Genre ?" for g in doc.findall('genre')]
      78. items = [ title, country + ' ' + year + ' (Bewertung/Stimmen: ' + rating[:3] + '/' + votes + ')' + ' ' + mpaa, runtime + ' min, ' + ', '.join(genre), plot, 'Regie: ' + director, 'Darsteller: ' + ', '.join(names)]
      79. basename = os.path.splitext(filename)[0]
      80. with io.open(basename + '.txt', 'w', encoding='utf-8') as fh:
      81. fh.write(u'\n\n'.join(items))
      Display All

      sh-script

      Shell-Script: call-parser.sh

      1. #!/bin/bash
      2. cd /hdd/movie/Filme/wasndas
      3. while IFS= read -r -d '' desc; do echo $desc; python parser.py "$desc"; done < <(find . -type f -name '*.nfo' -print0)
      4. echo "fertig :)"

      @rdamas
      danke für deine antwort.
      habs nochmal in codeblocks gepackt, vielleicht möcht es ja noch jemand nutzen
      hab im shellscript die ausgabe des files zugefügt und damit den fehler dann auch gefunden (in einem der verzeichnisse war ein .nfo datei, die keine war)

      und meine 'komplizierte' zeile im shellscript nehme ich deswegen, weil deine nicht funktioniert ;) (auch nicht, wenn man den fehlenden find befehl zufügt)

      aber trotzdem vielen dank, weil dein hinweis mit dem filenamen ja das problem gelöst hat :)
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.
    • Ups - ja wo ist der Befehl denn abgeblieben? Hab die Zeile mal korrigiert. Spricht meiner Meinung nichts dagegen, das zu benutzen (habe ich exakt so in einer Menge Scripten so drin, gibt auch keine Probleme mit Leerzeichen in Filenamen) - aber solange du verstehst, was dein Script da macht, ist alles gut. Ich versteh's leider nicht.
    • genau die leerzeichen sinds aber doch, die bei mir dann nicht funzen
      bei meiner zeile ist das #bash wichtig, wegen der form der redirection, in sh funktioniert die nicht
      ansonsten packt die -print0 option alles in eine einzeilige ausgabe und durch das read mit der delims option habe ich das leerzeichen problem nicht mehr
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.
    • teste es mal mit einem echo befehl.
      die aufspaltung passiert beeits im find-befehl, von da kommt der filename bereits mehrzeilig wieder, da kann ich nichts in anführungszeichen setzen


      ich habe hier ein verzeichnis mit einem file
      # ls
      ich habe leerzeichen.nfo


      der find-befehl einzekn ausgeführt bringt folgendes:
      # find . -type f -name "*.nfo"
      ./ich habe leerzeichen.nfo


      in einer for file schleife passiert aber dann das:
      # for f in $(find . -type f -name "*.nfo"); do echo "$f"; done
      ./ich
      habe
      leerzeichen.nfo


      dementsprechend will er dann 3x etwas falsches parsen
      wo sollen denn da noch ausrufezeichen hin ?
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.

      The post was edited 1 time, last by wsxws ().

    • EDIT: was allesdings ersatzlos weg kann ist das IFS=

      Source Code

      1. while read -r -d '' desc; do echo "$desc"; python parser.py "$desc"; done < <(find . -type f -name '*.nfo' -print0)
      die zeile reicht auch so
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.
    • dann ist das ergebnis eine leere zeile.

      testest du das eigentlich bei dir und das funzt dann nur bei mir nicht oder denskt du nur, dass das funzen müsste ?
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.
    • Natürlich teste ich das. Und natürlich funktioniert das bei mir auch. Aber wie schon gesagt: wenn dein Weg funktioniert, ist doch alles gut. Ich finds halt reichlich unverständlich und mache so was deswegen anders.

      Wer weiss - vielleicht tut's bei dir einfach deswegen nicht, weil du nicht die Bash als Shell benutzt oder die Krüppel-Busybox mal wieder was anderes macht als die ausgewachsenen Tools - ist mir auch egal.
    • EDIT: doofes c/p, hatte nicht gesehen, dass du .nfo gegen .ts getauscht hattest ABER

      echo funzt amder parsen nicht, oder auch:

      Source Code

      1. while read -r -d '' desc; do echo "$desc"; ./parser.py "$desc"; done < <(find . -type f -name '*.nfo' -print0)



      listet alle files der reihe nach auf und legt die gewünschten txt-dateien an

      Source Code

      1. for f in "$(find . -name "*.nfo")"; do echo "$f"; ./parser.py "$f"; done

      listet auch alle files der reihe nach auf aber legt die gewünschten dateien nicht an.
      dafür gibt es am ende folgende fehlermeldung:

      Source Code

      1. Traceback (most recent call last):
      2. File "./parser.py", line 92, in <module>
      3. items = [ title, country + ' ' + year + ' (Bewertung/Stimmen: ' + rating[:3] + '/' + votes + ')' + ' ' + mpaa, runtime + ' min, ' + ', '.join(genre), plot, 'Regie: ' + director, 'Darsteller: ' + ', '.join(names)]
      4. NameError: name 'title' is not defined

      und ja, title ist defined und wird ja auch bei der readvariante gefunden

      ich hab damlas auch mit dem for var angefangen und bin wegen solcher probleme bei der read-version gelandet
      die for var wäre natürlich schlanker und schneller, ich bekomme die aber so halt nicht zum laufen
      Gruß wsxws


      Eine prima alternative zu Dreambox Edit mit einigen zusätzlichen Features, die das Leben erleichtern.