2009-10-29 9 views
10

Programuję w Python i uzyskuję informacje ze strony internetowej za pośrednictwem biblioteki urllib2. Problem polega na tym, że ta strona może dostarczyć mi znaków spoza ASCII, jak 'ñ', 'á' etc. W chwili urllib2 dostaje tę postać, to wywołuje wyjątek, tak:Jak obsługiwać znaki Unicode (spoza zestawu ASCII) w języku 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) 

muszę obsłużyć te postacie. Mam na myśli, nie chcę obsługiwać wyjątku, ale kontynuować program. Czy jest jakiś sposób, aby na przykład (nie wiem, czy to jest coś głupiego), użyć innego codec zamiast ASCII? Ponieważ muszę pracować z tymi postaciami, wstawić je do bazy danych, itp.

+0

Przydałoby się, gdybyś mógł powiedzieć również, czy używasz Pythona 3+ lub czegoś wcześniejszego. –

+0

Nie można używać Py3k, ponieważ moduł urllib2 został usunięty (opakowany w urllib) ... –

+0

Duplikat: http://stackoverflow.com/questions/1020892/python-urllib2-read-to-unicode –

Odpowiedz

9

Właśnie przeczytałeś zestaw bajtów z gniazda. Jeśli chcesz ciąg trzeba go zdekodować:

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

(zastępując cokolwiek kodowania używasz do utf-8)

Następnie trzeba zrobić odwrotnie, aby wysłać go z powrotem:

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

Chcesz użyć unikodu dla całej swojej pracy, jeśli możesz.

Prawdopodobnie znajdzie to pytanie/odpowiedź przydatne:

urllib2 read to Unicode

0

Możecie zajrzeć do biblioteki przy użyciu rzeczywiste parsowania znaleźć te informacje. lxml, na przykład, już adresuje kodowanie/dekodowanie Unicode przy użyciu zadeklarowanego zestawu znaków.

+0

Niestety, wiele stron produkuje niewłaściwie zakodowane dokumenty, ogólnie kodowanie będzie w większości poprawne, ale będą sporadyczne niepoprawne sekwencje bajtów. Niektóre aplikacje nie będą musiały się tym martwić, ale jeśli indeksujesz losowe publiczne strony internetowe, będzie to problem. – mikerobi

Powiązane problemy