2009-12-16 4 views
9

:can ile değil açık unicode url piton i ('í') bir İspanyol karbonlaşmış madde içeren bir ispanyolca url içeriği almak için çalışıyorum piton 2.5.2 ve linux debian kullanarak

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

ben Bu hatayı alıyorum: url geçirmeden önce

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

kullanıyorum denedim bu urllib için:

url = urllib.quote(url)

ve bu:

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

ama

Eğer yanlış yapıyorum bana söyleyebilir çalışmıyor?

cevap

3

, RFC 1378, URL'ler yalnızca ASCII karakter içerebilir. İyi açıklama here ve ben alıntı: Açıklamak verdik URL'lerin olarak

"...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."

, bu muhtemelen değiştirmek gerekecek demektir "küçük i akut aksanıyla" `% ED' ile.

+4

bu yana değişmiştir inanıyoruz ve en: İşte benim kod En az etki alanı artık rasgele Unicode karakterleri içerebilir. – Cerin

+0

@Cerin Sıralama. [IRI'lar rasgele Unicode karakterleri içerebilir] (https://www.w3.org/International/articles/idn-and-iri), ancak bunları normal URI'lere dönüştürdüğünüzde, 'Punycode' kullanarak ASCII'ye normalleştirilirler (etki alanı bileşeni) ve yüzde kodlaması (yol bileşeni için). –

4

URL'yi utf-8 olarak kodlamak işe yaramadı. Kaynak dosyanızın düzgün bir şekilde kodlanmış olup olmadığını ve tercümanın bunu bilip bilmediğini merak ediyorum. senin piton kaynak dosyası UTF-8 olarak kaydedilirse, örneğin, o zaman birinci veya ikinci hat olarak

# coding=UTF-8 

olmalıdır. Benim için çalışıyor.

Düzenleme: Ayrıca, etkileşimli bir Python oturumunda (IDLE veya bir konsol aracılığıyla) Unicode metin kodlama ile ilgili zorluk ile dolu olduğunu unutmayın. Bu durumlarda, Unicode edebi türlerini kullanmalısınız (örneğinizde \ u00ED gibi).

6

Bu benim için çalışıyor: Uygulanabilir standart Başına

#!/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

Benim için çalışıyor. Python'un oldukça yeni bir sürümünü kullandığınızdan ve dosya kodlamanızın doğru olduğundan emin olun. (DNS araması başarısız böylece, mydomain.es yok, ancak hiçbir unicode sorunları o noktaya vardır.)

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

+2

python 3 ile 'AttributeError: 'bayt' nesnesinin bu kodu kullanırken 'timeout' özelliği yoktur. Python 3 çözümü var mı? – byxor

+1

@BrandonIbbotson: url yerine: urllib.parse.quote (url) 'yi denemelisiniz.encode ('utf-8') ' Burada daha fazla bilgi bulabilirsiniz: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

Teşekkürler @Snooze! – byxor