2016-04-08 7 views
0

Python-Neuling (natürlich) mit einigen Problemen mit der Decodierung einer URI-codierten Zeichenfolge.Python, UTF-8 URI-Decodierung

Mein Code:

#/usr/bin/env python 
# -*- coding: utf-8 -*- 
# Encoding: UTF-8 
... 
import urllib 
... 
secondTag = urllib.unquote(secondTag).decode('utf8') 
... 

Wenn

secondTag = "flashvars=%7B%22video%22%3A%7B%22videoReferences%22%3A%5B%7B%22url%22%3A%22http%3A%2F%2Fsvtplay6a-f.akamaihd.net%2Fz%2Fse%2Fopen%2F20160405%2F1114066-002A%2FPG-1114066-002A-AFFARENRAMEL-01_%2C988%2C240%2C348%2C456%2C636%2C1680%2C2796%2C.mp4.csmil%2Fmanifest.f4m%22%2C%22playerType%22%3A%22flash%22%7D%5D%2C%22subtitleReferences%22%3A%5B%7B%22url%22%3A%22http%3A%2F%2Fmedia.svt.se%2Fdownload%2Fmcc%2Ftest%2Fcore-prd%2FSUB-1114066-002A-AFFARENRAMEL%2FSUB-1114066-002A-AFFARENRAMEL.wsrt%22%7D%5D%2C%22position%22%3A0%7D%2C%22statistics%22%3A%7B%22client%22%3A%22nojs%22%2C%22mmsClientNr%22%3A%221001001%22%2C%22programId%22%3A%221114066-002A%22%2C%22statisticsUrl%22%3A%22%2F%2Fld.svt.se%2Fsvt%2Fsvt%2Fs%3Fnojs.Aff%C3%A4ren%20Ramel.Avsnitt%202%22%2C%22title%22%3A%22Avsnitt%202%22%2C%22folderStructure%22%3A%22Aff%C3%A4ren%20Ramel%22%7D%2C%22context%22%3A%7B%7D%7D" 

Ergebnis ist:

File "/home/mythtv/bin/pyPirateDownloader/svtPlay.py", line 70, in checkSecondSvtPage 
secondTag = urllib.unquote(secondTag).decode('utf8') 
File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode 
return codecs.utf_8_decode(input, errors, True) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 509-510: ordinal not in range(128) 

Allerdings, wenn ich das gleiche in Python Konsole laufen bekomme ich das erwartete Ergebnis:

>>> import urllib 
>>> secondTag = "flashvars=%7B%22video%22%3A%7B%22videoReferences%22%3A%5B%7B%22url%22%3A%22http%3A%2F%2Fsvtplay6a-f.akamaihd.net%2Fz%2Fse%2Fopen%2F20160405%2F1114066-002A%2FPG-1114066-002A-AFFARENRAMEL-01_%2C988%2C240%2C348%2C456%2C636%2C1680%2C2796%2C.mp4.csmil%2Fmanifest.f4m%22%2C%22playerType%22%3A%22flash%22%7D%5D%2C%22subtitleReferences%22%3A%5B%7B%22url%22%3A%22http%3A%2F%2Fmedia.svt.se%2Fdownload%2Fmcc%2Ftest%2Fcore-prd%2FSUB-1114066-002A-AFFARENRAMEL%2FSUB-1114066-002A-AFFARENRAMEL.wsrt%22%7D%5D%2C%22position%22%3A0%7D%2C%22statistics%22%3A%7B%22client%22%3A%22nojs%22%2C%22mmsClientNr%22%3A%221001001%22%2C%22programId%22%3A%221114066-002A%22%2C%22statisticsUrl%22%3A%22%2F%2Fld.svt.se%2Fsvt%2Fsvt%2Fs%3Fnojs.Aff%C3%A4ren%20Ramel.Avsnitt%202%22%2C%22title%22%3A%22Avsnitt%202%22%2C%22folderStructure%22%3A%22Aff%C3%A4ren%20Ramel%22%7D%2C%22context%22%3A%7B%7D%7D" 
>>> secondTag = urllib.unquote(secondTag).decode('utf8') 
>>> print secondTag 
flashvars={"video":{"videoReferences":[{"url":"http://svtplay6a-f.akamaihd.net/z/se/open/20160405/1114066-002A/PG-1114066-002A-AFFARENRAMEL-01_,988,240,348,456,636,1680,2796,.mp4.csmil/manifest.f4m","playerType":"flash"}],"subtitleReferences":[{"url":"http://media.svt.se/download/mcc/test/core-prd/SUB-1114066-002A-AFFARENRAMEL/SUB-1114066-002A-AFFARENRAMEL.wsrt"}],"position":0},"statistics":{"client":"nojs","mmsClientNr":"1001001","programId":"1114066-002A","statisticsUrl":"//ld.svt.se/svt/svt/s?nojs.Affären Ramel.Avsnitt 2","title":"Avsnitt 2","folderStructure":"Affären Ramel"},"context":{}} 

Natürlich ist dies ein Codierungsproblem, und ich denke, das hat etwas mit den'ä'-Zeichen zu tun, da dieses Problem nicht auftritt, wenn keine schwedischen Zeichen vorhanden sind, aber ich weiß einfach nicht warum und wie repariere es.

Jemand in der Lage zu erklären und vielleicht dabei helfen?

Dank /jon

Antwort

2

Beachten Sie, dass es sich um eine Unicode Encode Fehler ist: dies ist nicht versagt, sie zu entschlüsseln, das es zu kodieren versagt!

Da Python 2 automatisch zwischen str und unicode konvertiert, können Sie Codierungsfehler erhalten, wenn Sie versuchen, eine Unicode-Zeichenfolge zu dekodieren.

Dies ist wahrscheinlich, was geschieht hier: ich in der Datei vermute, ist secondTag ein unicode Objekt: urllib.unquote wird dann ein unicode Objekt zurück, so dass, wenn Sie versuchen, es zu entschlüsseln versucht es zuerst zu einem Objekt str zu codieren, so Es kann es mit der Standardcodierung ascii decodieren, die fehlschlägt.

Es gibt keine besonders elegante Möglichkeit, damit umzugehen. Der wahrscheinlich eleganteste Weg ist urllib.unquote(secondTag.encode('utf8')).decode('utf8'). Wenn Sie den Fall behandeln möchten, in dem es bereits eine str ist, können Sie einfach if isinstance(secondTag, unicode) else secondTag hinzufügen.

+0

Ausgezeichnet. Versuchte die erste Ihrer Lösungen und das hat es getan. Muss wirklich versuchen, diese Kodierung zu verstehen. Danke Kumpel! /jon – jonsag