2009-12-16 14 views
9

mit Python 2.5.2 und Linux Debian ich versuche, den Inhalt von einem spanischen URL zu erhalten, die einen spanischen char ('I') enthält:nicht öffnen kann Unicode-URL mit Python

import urllib 
url = u'http://mydomain.es/índice.html' 
content = urllib.urlopen(url).read()

I bin diesen Fehler:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)

ich habe versucht, bevor die uRL übergeben, dies urllib:

url = urllib.quote(url)

und diese:

url = url.encode('UTF-8')

, aber es funktioniert nicht

können Sie mir sagen, was ich falsch mache?

Antwort

3

Berücksichtigung der geltenden Norm, RFC 1378 können URLs nur ASCII-Zeichen enthalten. Gute Erklärung here, ich zitiere:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

Da die URLs ich gegeben habe erklären, ist dies wahrscheinlich bedeutet, dass Sie ersetzen müssen, dass „Klein i mit Akut“ mit `% ED‘.

+4

Ich glaube, das inzwischen geändert hat, und bei Die wenigsten Domains können jetzt beliebige Unicode-Zeichen enthalten. – Cerin

+0

@Cerin Art von. [IRIs können beliebige Unicode-Zeichen enthalten] (https://www.w3.org/International/articles/idn-and-iri), aber wenn Sie sie in normale URIs konvertieren, werden sie mit Punycode (für die Domain-Komponente) und Prozent-Codierung (für die Pfadkomponente). –

4

Codierung der URL als utf-8, sollte funktioniert haben. Ich frage mich, ob Ihre Quelldatei korrekt codiert ist und ob der Interpreter sie kennt. Wenn Sie Ihre Python-Quelldatei als UTF-8, beispielsweise gespeichert wird, dann sollten Sie

# coding=UTF-8 

als erste oder zweite Zeile haben.

import urllib 
url = u'http://mydomain.es/índice.html' 
content = urllib.urlopen(url.encode('utf-8')).read() 

funktioniert für mich.

Bearbeiten: Beachten Sie auch, dass Unicode-Text in einer interaktiven Python-Sitzung (ob über IDLE oder eine Konsole) mit codierungsbezogenen Schwierigkeiten behaftet ist. In solchen Fällen sollten Sie Unicode-Literale verwenden (wie in Ihrem Fall \ u00e).

6

Dies funktioniert für mich:

#!/usr/bin/env python 
# define source file encoding, see: http://www.python.org/dev/peps/pep-0263/ 
# -*- coding: utf-8 -*- 

import urllib 
url = u'http://example.com/índice.html' 
content = urllib.urlopen(url.encode("UTF-8")).read() 
3

Es funktioniert für mich. Stellen Sie sicher, dass Sie eine relativ neue Version von Python verwenden und Ihre Dateicodierung korrekt ist. Hier ist mein Code:

# -*- coding: utf-8 -*- 
import urllib 
url = u'http://mydomain.es/índice.html' 
url = url.encode('utf-8') 
content = urllib.urlopen(url).read() 

(mydomain.es existiert nicht, so dass der DNS-Lookup fehlschlägt, aber es gibt keine Unicode Fragen zu diesem Punkt.)

+2

Mit Python 3 bekomme ich 'AttributeError: 'Bytes' Objekt hat kein Attribut 'Timeout' bei Verwendung dieses Codes. Gibt es eine Python 3-Lösung? – byxor

+1

@BrandonIbbotson Sie sollten versuchen: 'urllib.parse.quote (url)' anstelle von 'url.encode ('utf-8') ' Sie können mehr darüber hier lesen: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

Dank @Snooze! – byxor