Mam ciąg, który wygląda tak:
6Â 918Â 417Â 712
Jasnym sposobem przycięcia tego ciągu (jak rozumiem Python) jest po prostu powiedzenie, że ciąg znajduje się w zmiennej o nazwie s
, otrzymujemy:
s.replace('Â ', '')
To powinno załatwić sprawę. Ale oczywiście narzeka, że znak spoza ASCII '\xc2'
w pliku blabla.py nie jest zakodowany.
Nigdy nie mogłem zrozumieć, jak przełączać się między różnymi kodowaniami.
Oto kod, tak naprawdę jest taki sam jak powyżej, ale teraz jest w kontekście. Plik jest zapisywany jako UTF-8 w notatniku i ma następujący nagłówek:
#!/usr/bin/python2.4
# -*- coding: utf-8 -*-
Kod:
f = urllib.urlopen(url)
soup = BeautifulSoup(f)
s = soup.find('div', {'id':'main_count'})
#making a print 's' here goes well. it shows 6Â 918Â 417Â 712
s.replace('Â ','')
save_main_count(s)
Nie idzie dalej niż s.replace
...
u
Odpowiedzi:
Python 2 używa
ascii
domyślnego kodowania dla plików źródłowych, co oznacza, że musisz określić inne kodowanie na początku pliku, aby użyć znaków Unicode innych niż ASCII w literałach. Python 3 używautf-8
domyślnego kodowania plików źródłowych, więc jest to mniejszy problem.Zobacz: http://docs.python.org/tutorial/interpreter.html#source-code-encoding
Aby włączyć kodowanie źródła utf-8, powinno to znaleźć się w jednym z dwóch górnych wierszy:
Powyższe znajduje się w dokumentacji, ale działa to również:
Dodatkowe uwagi:
Plik źródłowy należy również zapisać przy użyciu prawidłowego kodowania w edytorze tekstu.
W Pythonie 2 literał Unicode musi mieć
u
przed sobą znak , jak w przypadku,s.replace(u"Â ", u"")
ale w Pythonie 3 po prostu użyj cudzysłowów. W Pythonie 2 możnafrom __future__ import unicode_literals
uzyskać zachowanie Pythona 3, ale należy pamiętać, że ma to wpływ na cały bieżący moduł.s.replace(u"Â ", u"")
również zakończy się niepowodzeniem, jeślis
nie jest ciągiem znaków Unicode.string.replace
zwraca nowy ciąg i nie edytuje go w miejscu, więc upewnij się, że używasz również wartości zwracanejźródło
# coding: utf-8
.-*-
nie służy do dekoracji, ale prawdopodobnie nigdy jej nie będziesz potrzebować. Myślę, że był tam dla starych muszli.edycja: moim pierwszym impulsem jest zawsze użycie filtra, ale wyrażenie generatora jest bardziej wydajne w pamięci (i krótsze) ...
Pamiętaj, że gwarantuje to działanie z kodowaniem UTF-8 (ponieważ wszystkie bajty w znakach wielobajtowych mają najwyższy bit ustawiony na 1).
źródło
u
jeśli jest to literał.źródło
Poniższy kod zamieni wszystkie znaki spoza zestawu ASCII na znaki zapytania.
źródło
Korzystanie z Regex:
źródło
O wiele za późno na odpowiedź, ale oryginalny ciąg był w UTF-8, a '\ xc2 \ xa0' to UTF-8 dla PRZESTRZENI BEZ PRZERW. Po prostu zdekoduj oryginalny ciąg jako
s.decode('utf-8')
(\ xa0 wyświetla się jako spacja, gdy dekodowany jest nieprawidłowo jako Windows-1252 lub latin-1:Przykład (Python 3)
Wynik
źródło
To zostanie wydrukowane
6 918 417 712
źródło
Wiem, że to stary wątek, ale poczułem się zmuszony wspomnieć o metodzie tłumaczenia, która jest zawsze dobrym sposobem na zastąpienie wszystkich kodów znaków powyżej 128 (lub innych, jeśli to konieczne).
Zastosowanie : str. translate ( table [, deletechars] )
Począwszy od Pythona 2.6 , możesz także ustawić tabelę na None i użyć deletechars, aby usunąć znaki, których nie chcesz, jak w przykładach pokazanych w standardowej dokumentacji na http://docs.python.org/library/stdtypes. html .
W przypadku łańcuchów Unicode tablica translacji nie jest łańcuchem 256-znakowym, ale dyktatem z ord () odpowiednich znaków jako kluczy. W każdym razie uzyskanie prawidłowego ciągu ascii z ciągu znaków Unicode jest dość proste, przy użyciu metody wspomnianej powyżej przez truppo, a mianowicie: unicode_string.encode ("ascii", "ignore")
Podsumowując, jeśli z jakiegoś powodu absolutnie potrzebujesz uzyskać ciąg ascii (na przykład, gdy zgłaszasz standardowy wyjątek za pomocą
raise Exception, ascii_message
), możesz użyć następującej funkcji:Zaletą translate jest to, że można faktycznie konwertować znaki akcentowane na odpowiednie znaki ascii bez akcentu zamiast po prostu je usuwać lub zastępować znakiem „?”. Jest to często przydatne, na przykład do celów indeksowania.
źródło
i
.py
unicode pliku.źródło
To brudny hack, ale może zadziałać.
źródło
Na ile to było warte, mój zestaw postaci był
utf-8
i włączyłem klasyczną# -*- coding: utf-8 -*-
linię " ".Jednak odkryłem, że nie mam Universal Newlines podczas odczytywania tych danych ze strony internetowej.
Mój tekst miał dwa słowa oddzielone znakiem „
\r\n
”. Ja tylko rozszczepiałem\n
i wymieniłem"\n"
.Kiedy przeszedłem przez pętlę i zobaczyłem omawianą postać, zdałem sobie sprawę z błędu.
Może więc również znajdować się w zestawie znaków ASCII , ale znak, którego się nie spodziewałeś.
źródło