Hallo beisammen,
ich hab mal ein bisschen angefangen mit ein bisschen "Fingerübungen" für ein kleines Addon. Kurz gesagt bin ich zu faul immer mal wieder zu schauen ob es bei bestimmten Buchreihen von mir neue Bücher gibt und manchmal bin ich mir über die Reihenfolge nicht sicher. Natürlich macht ne Handyapp mehr Sinn, ich wollte aber mal mich etwas mehr in Kodi und Python Programmierung probieren und hab hin und wieder mal etwas rumprobiert. Wirklich schnell ist das nicht voran gegangen, aber es hat relativ gut "funktioniert", solange ich nicht mit Umlauten zu kämpfen hatte. Und irgendwie hab ich das Gefühl ich komm hier nicht mehr ohne Hilfe weiter:
Problem ist folgendes:
- Ich extrahiere mit RegEx aus ner HTML nen JSON String, der von der Codierung her noch passt.
Sobald ich aber json.loads mache, passt die codierung nicht mehr und ich raff irgendwie nicht, wie ich damit umgehen muss...
Beispiel:
In der URL: https://www.lovelybooks.de/autor/Robert-G…lge-1117815300/
steckt im Quellcode:
Spoiler anzeigen
{"@type":"ItemList","itemListElement":[{"name":"Der Ruf des Kuckucks","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/Der-Ruf-des-Kuckucks-1062572907-w/","position":"1","@type":"Book","author":{"@type":"Person","name":"Robert Galbraith","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/"}},{"name":"Der Seidenspinner","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/Der-Seidenspinner-1114616007-w/","position":"2","@type":"Book","author":{"@type":"Person","name":"Robert Galbraith","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/"}},{"name":"Die Ernte des Bösen","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/Die-Ernte-des-Bösen-1221430454-w/","position":"3","@type":"Book","author":{"@type":"Person","name":"Robert Galbraith","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/"}}],"@context":"http://schema.org"}
Wenn ich nun folgenden Code verwende
try:
# Read data from url
html_page = urllib2.urlopen(url).read()
# xbmc.[definition='1','0']log[/definition]('The HTML RAW Data for the url %s is %s' % (url, html_page))
# Use RegEx to find the JSON Data within this html_page provided within <script type="application/ld\+json"> and </script>
raw_data = re.compile('<script type="application/ld\+json">(.+?)</script>', re.DOTALL).findall(html_page)[0]
xbmc.[definition='1','0']log[/definition]('The HTML RAW Data in the Script tags for the url %s is %s' % (url, raw_data))
# Load the data into JSON Format
json_data = json.loads(raw_data)
# # Output the Data
xbmc.[definition='1','0']log[/definition]('The JSON output for the url: %s is %s' % (url, json_data))
except (urllib2.URLError), e:
MyLog('Error reason: %s' % e )
if '429' or 'timed out' in e:
attempt += 1
MyLog('Attempt #%s - Too many requests - Pause 1 sec' % attempt)
xbmc.sleep(1000)
if attempt < 4:
return getJSONfromLovelyBooks(url)
return json_data
return json_data
Alles anzeigen
Dann ist der Output von Kodi:
Spoiler anzeigen
23:58:19.304 T:1924 DEBUG: The HTML RAW Data in the Script tags for the url https://www.lovelybooks.de/autor/Robert-G…lge-1117815300/ is {"@type":"ItemList","itemListElement":[{"name":"Der Ruf des Kuckucks","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/Der-Ruf-des-Kuckucks-1062572907-w/","position":"1","@type":"Book","author":{"@type":"Person","name":"Robert Galbraith","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/"}},{"name":"Der Seidenspinner","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/Der-Seidenspinner-1114616007-w/","position":"2","@type":"Book","author":{"@type":"Person","name":"Robert Galbraith","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/"}},{"name":"Die Ernte des Bösen","url":"https://www.lovelybooks.de/autor/Robert-G…Die-Ernte-des-Bösen-1221430454-w/","position":"3","@type":"Book","author":{"@type":"Person","name":"Robert Galbraith","url":"https://www.lovelybooks.de/autor/Robert-Galbraith/"}}],"@context":"http://schema.org"}
23:58:19.305 T:1924 DEBUG: The JSON output for the url: https://www.lovelybooks.de/autor/Robert-G…lge-1117815300/ is {u'@context': u'http://schema.org', u'itemListElement': [{u'url': u'https://www.lovelybooks.de/autor/Robert-G…s-1062572907-w/', u'position': u'1', u'author': {u'url': u'https://www.lovelybooks.de/autor/Robert-Galbraith/', u'@type': u'Person', u'name': u'Robert Galbraith'}, u'name': u'Der Ruf des Kuckucks', u'@type': u'Book'}, {u'url': u'https://www.lovelybooks.de/autor/Robert-G…r-1114616007-w/', u'position': u'2', u'author': {u'url': u'https://www.lovelybooks.de/autor/Robert-Galbraith/', u'@type': u'Person', u'name': u'Robert Galbraith'}, u'name': u'Der Seidenspinner', u'@type': u'Book'}, {u'url': u'https://www.lovelybooks.de/autor/Robert-G…Die-Ernte-des-B\xf6sen-1221430454-w/', u'position': u'3', u'author': {u'url': u'https://www.lovelybooks.de/autor/Robert-Galbraith/', u'@type': u'Person', u'name': u'Robert Galbraith'}, u'name': u'Die Ernte des B\xf6sen', u'@type': u'Book'}], u'@type': u'ItemList'}
Bösen wird also zu B\xf6sen, was später zum Problem führt:
"UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 65: ordinal not in range(128)"
Nun die Frage: was mach ich falsch bei json.loads? Ich hab das Gefühl da gibts irgendeinen Trick, aber ich hab alles mit .encode('utf8'), encoding('utf8') usw. probiert, was mir eingefallen ist... leider ohne Erfolg...
Hab euch mal den Code hinzugefügt, falls jemand es sich anschauen will... seid aber gnädig, ist mein erstes Kodi Addon das ich von Grundauf gebastelt hab und auch meine "ersten wirklichen Pythonversuche" ... bin also nicht sehr tief drin... außerdem bastel ich nur alle Wochen/Monate mal wieder Abends n bissl .. ist nur n Hobby
Viele Grüße,
Linkin