2009-10-29 46 views
10

Tôi đang lập trình ở Python và tôi đang lấy thông tin từ một trang web thông qua thư viện urllib2. Vấn đề là trang đó có thể cung cấp cho tôi với các ký tự ASCII, như 'ñ', 'á', vv Trong khoảnh khắc rất urllib2 được nhân vật này, nó gây ra một ngoại lệ, như thế này:Làm cách nào để xử lý các ký tự Unicode (không phải ASCII) bằng Python?

File "c:\Python25\lib\httplib.py", line 711, in send 
    self.sock.sendall(str) 
File "<string>", line 1, in sendall: 
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 74: ordinal not in range(128) 

tôi cần phải xử lý những nhân vật đó. Ý tôi là, tôi không muốn xử lý ngoại lệ nhưng để tiếp tục chương trình. Có cách nào để, ví dụ (tôi không biết nếu điều này là một cái gì đó ngu ngốc), sử dụng khác codec chứ không phải là ASCII? Vì tôi phải làm việc với các ký tự đó, hãy chèn chúng vào cơ sở dữ liệu, v.v.

+0

Sẽ hữu ích nếu bạn có thể nói, cho dù bạn đang sử dụng Python 3+ hay một cái gì đó trước đó. –

+0

Không thể là Py3k kể từ khi mô-đun urllib2 đã được gỡ bỏ (bọc vào urllib) ... –

+0

Trùng lặp: http://stackoverflow.com/questions/1020892/python-urllib2-read-to-unicode –

Trả lời

9

Bạn chỉ cần đọc một bộ byte từ ổ cắm. Nếu bạn muốn có một chuỗi bạn phải giải mã nó:

yourstring = receivedbytes.decode("utf-8") 

(thay thế bất cứ điều gì bạn đang sử dụng mã hóa cho utf-8)

Sau đó, bạn phải làm điều ngược lại để gửi nó lại ra:

outbytes = yourstring.encode("utf-8") 
6

Bạn muốn sử dụng unicode cho tất cả công việc của mình nếu có thể.

Bạn có thể sẽ tìm thấy câu hỏi này/trả lời hữu ích:

urllib2 read to Unicode

0

Bạn có thể muốn xem xét việc sử dụng một thư viện phân tích thực tế để tìm thông tin này. Ví dụ: lxml, đã giải quyết mã hóa/giải mã Unicode bằng bộ ký tự được khai báo.

+0

Thật không may là rất nhiều trang web sản xuất các tài liệu được mã hóa không đúng cách, thường mã hóa sẽ chủ yếu là chính xác, nhưng sẽ có các chuỗi byte không hợp lệ rời rạc. Một số ứng dụng sẽ không phải lo lắng về điều này, nhưng nếu bạn đang thu thập dữ liệu các trang web công cộng ngẫu nhiên, nó sẽ là một vấn đề. – mikerobi

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