UTF-8 Chinesisches Zeichen in zu öffnender URL (Python 3)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

Ich habe Probleme, wenn ich eine URL öffnen möchte, in der ein Chinesisches Schriftzeichen vorkommt.

Ich bin mit Python3 unterwegs und öffne das Script auf meinem Mac auch explizit mit
python3 test.py

Gebe ich die zu öffnende URL auf dem Bildschirm aus statt zu versuchen die Adresse zu öffnen, wird sie völlig korrekt angezeigt ... wie auch anders zu erwarten, Python 3 unterstützt UTF-8 ja von Haus aus, gelle?!

Code: Alles auswählen

import urllib.request

html_adresse = 'http://www.hanzicraft.com/character/的'
#print(api_adresse)

resource = urllib.request.urlopen(html_adresse)
content =  resource.read().decode(resource.headers.get_content_charset())
Versuche ich dagegen die URL zu öffnen, bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "test.py", line 6, in <module>
resource = urllib.request.urlopen(html_adresse)
...
UnicodeEncodeError: 'ascii' codec can't encode character '\u7684' in position 7: ordinal not in range(128)
Versuche ich dagegen jede beliebige andere URL ohne chinesischem Schriftzeichen zu öffnen, gibt es keinen Fehler.

Ich habe es mit Suche im Forum und mit Google versucht.
Doch alles was ich finde, ist dass Leute diese Probleme mit Python 2 haben ... in Python 3 jedoch nicht :-(

Kann jemand von Euch mein Problem in Python 3 nachvollziehen?
Tipps für die Lösung?

Danke schon einmal!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonderzeichen muß man in URLs codieren. Z.B.: `urllib.parse.quote(html_adresse, safe='/:?@&=+')`
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@marcusp: das musst du für Python2 wie 3 gleichermaßen tun. Sonderzeichen in URLs (ASCII wie non-ASCII) gehören entsprechend "URL-Enkodiert", auch "Prozentkodierung" genannt, weil Sonderzeichen durch ein % gefolgt von Dezimalzahlen ersetzt werden.
When we say computer, we mean the electronic computer.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ein weiterer Grund das `requests`-Modul zu verwenden, das macht das netterweise schon für einen. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Tatsächlich! Ich dachte mir vorhin beim Schneeschaufeln dass das doch bei requests out of the box geht, hatte aber nicht in Erinnerung dass der TE urllib verwendet.
When we say computer, we mean the electronic computer.
marcusp
User
Beiträge: 10
Registriert: Donnerstag 10. Januar 2019, 07:37

ich habe jetzt das Requests-Modul installiert und muss sagen, damit funktioniert es wunderbar.
Dankeschön :-)

Falls es ein anderer Anfänger sucht: http://docs.python-requests.org/en/master/
Antworten