Błąd kodowania w python?

0

Mam napisany skrypt pobierający treść z pewnej strony ale gdy natrafi na jakiś polski znak (ś,ń,ć itd.) to wyświetla się błąd: UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 16: ordinal not in range(128)

Jak rozwiązać ten problem? Z góry dzięki za pomoc ;)

1

Wpisać na początku skryptu linijkę z kodowaniem?

# -*- coding: utf-8 -*-
0

niestety dodanie tej linii nie pomaga :/

1

Błąd jest po twojej stronie a nie po stronie pytona...
Próbujesz do zwykłego ascii stringa ładować utf8 stąd takie kwiatki. Pokaż jak te dane czytasz ;] Pewnie masz tam jakieś zwykłe open zamiast codecs.open z definicją kodowania. Możesz też od biedy na danych które ściągniesz zrobić .decode("utf-8")

0

Już sobie poradziłem...

import sys
reload(sys)
sys.setdefaultencoding('utf8')

1

W 99% przypadków nie należy tego ruszać (zresztą celowo jest to
utrudnione -- poprzez usuwanie tej funkcji z modułu sys zaraz po
pierwszym jej użyciu w module site...).

Funkcja ta ustawia tzw. domyślne kodowanie Pythona -- dla sytuacji,
w których programista nie określił, jakie kodowanie ma być użyte do
zakodowania/rozkodowania... Np. jeżeli użyjemy encode()/decode()
bez podawania kodowania, lub jeżeli (jest wiele takich sytuacji)
Python dostał unicode, a spodziewał się str, lub jeżeli dostał str, a
spodziewał się unicode -- sam niejawnie rozkodowuje/zakodowuje dane
by uzyskać właściwy typ; używa wtedy owego domyślnego kodowania.

Domyślne kodowanie jest standardowo ustawione na ascii (obejmje
tylko najbardziej standardowe 128 znaków: alfabet łaciński,
podstawowe znaki matematyczne i przestankowe, podstawowe kody
kontrolne, np. znak końca wiersza...), co oznacza, że np. kod:

 u"żółć".encode()

...spowoduje wystąpienie wyjątku UnicodeEncodeError.


Na koniec kilka morałów:

w odniesieniu do tekstu -- wszędzie gdzie się da, należy używać
obiektów unicode a nie str, a jedynie na wejściu/wyjściu
odkodowywać/zakodowywać z/do postaci ciągu bajtów (str),

na dłuższą metę lepiej podawać kodowanie jawnie ("explicit is
better than implicit" -- Zen of Python) i raczej unikać sytuacji,
w których Python będzie dokonywać automatycznego-niejawnego
kodowania/dekodowania (bo gdy wyskoczy błąd związany z kodowaniem,
często trudno potem dojść, gdzie tak naprawdę nastąpiło
zniekształcenie danych...).

Pozdrawiam,

Jan Kaliszewski (zuo)

PS. UWAGA: cała moja odpowiedź dotyczy Pythona 2.x. W Pythonie 3.x
rzeczy wyglądają trochę inaczej: dawny typ unicode nazywa się str,
a dawnego str nie ma. Jest za to typ bytes (i pokrewny mu bytearray...),
do pewnego stopnia podobny do dawnego str, ale nieprzeznaczony do
operowania danymi tekstowymi, a jedynie binarnymi (ale to inna historia).

W Pythonie 3.x nie ma też niejawnego automatycznego kodowania/dekodowania
-- doświadczenia Pythona 2.x pokazują, że sprawiało ono wiele kłopotów.
W Pythonie 3.x programista, jeżeli poda dane złego typu otrzyma jasny
komunikat błędu, a nie nieprawidłowe wyniki zmuszające do bawienia się
w Sherlocka Holmesa ("w którym momencie Python dokonał tego niejawnego
kodowania/dekodowania?").

--
Jan Kaliszewski (zuo)

Źródło: https://groups.google.com/forum/?fromgroups=#!topic/pl.comp.lang.python/2_UvtIdcVMk

1 użytkowników online, w tym zalogowanych: 0, gości: 1