2009-12-16 26 views
9

sử dụng python 2.5.2 và debian linux tôi đang cố gắng để có được nội dung từ một url Tây Ban Nha có chứa một char Tây Ban Nha ('í'):không thể url unicode mở với python

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

tôi đang nhận được lỗi này:

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

tôi đã cố gắng sử dụng trước khi đi qua url để urllib này:

url = urllib.quote(url)

và điều này:

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

nhưng nó không hoạt động

bạn có thể cho tôi biết những gì tôi đang làm sai?

Trả lời

3

mỗi tiêu chuẩn được áp dụng, RFC 1378, URL chỉ có thể chứa các ký tự ASCII. Tốt giải thích here, và tôi trích dẫn:

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

Do URLs Tôi đã trao giải thích, điều này có lẽ có nghĩa là bạn sẽ phải thay thế rằng "chữ thường tôi với giọng cấp tính" với `% ED'.

+4

Tôi tin rằng điều này từ đó đã được thay đổi, và tại ít nhất các miền hiện có thể chứa các ký tự Unicode tùy ý. – Cerin

+0

@Cerin Sắp xếp. [IRI có thể chứa các ký tự Unicode tùy ý] (https://www.w3.org/International/articles/idn-and-iri), nhưng khi bạn chuyển đổi chúng thành các URI thông thường, chúng sẽ được chuẩn hóa thành ASCII sử dụng 'Punycode' (cho thành phần tên miền) và phần trăm mã hóa (cho thành phần đường dẫn). –

4

Mã hóa URL là utf-8, nên đã hoạt động. Tôi tự hỏi liệu tệp nguồn của bạn có được mã hóa đúng hay không và liệu người thông dịch có biết nó hay không. Nếu tệp nguồn python của bạn được lưu dưới dạng UTF-8, chẳng hạn, thì bạn nên có

# coding=UTF-8 

làm dòng đầu tiên hoặc dòng thứ hai.

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

làm việc cho tôi.

Chỉnh sửa: cũng phải lưu ý rằng văn bản Unicode trong phiên Python tương tác (cho dù thông qua IDLE hoặc bảng điều khiển) có đầy khó khăn về mã hóa. Trong những trường hợp đó, bạn nên sử dụng các chữ cái Unicode (như trường hợp của bạn).

6

này làm việc cho tôi:

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

Nó phù hợp với tôi. Đảm bảo bạn đang sử dụng phiên bản Python khá gần đây và mã hóa tệp của bạn là chính xác. Dưới đây là mã của tôi:

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

(mydomain.es không tồn tại, do đó tra cứu DNS thất bại, nhưng không có vấn đề unicode đến thời điểm đó.)

+2

Với python 3, tôi nhận được 'AttributeError: đối tượng 'byte' không có thuộc tính 'timeout'' khi sử dụng mã này. Có một giải pháp python 3? – byxor

+1

@BrandonIbbotson Bạn nên thử: 'urllib.parse.quote (url)' thay vì 'url.mã hóa ('utf-8') ' Bạn có thể đọc thêm tại đây: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

Cảm ơn @Snooze! – byxor

Các vấn đề liên quan