Obecnie używam Beautiful Soup do parsowania pliku HTML i wywoływania get_text()
, ale wygląda na to, że mam dużo \ xa0 znaków reprezentujących spacje. Czy istnieje skuteczny sposób na usunięcie ich wszystkich w Pythonie 2.7 i zamianę ich w spacje? Wydaje mi się, że bardziej ogólne pytanie brzmi: czy istnieje sposób na usunięcie formatowania Unicode?
Próbowałem użyć line = line.replace(u'\xa0',' ')
:, jak sugeruje inny wątek, ale zmieniło to \ xa0 na u, więc teraz zamiast tego mam wszędzie „u”. ):
EDIT: Problem wydaje się być rozwiązany str.replace(u'\xa0', ' ').encode('utf-8')
, ale po prostu robi .encode('utf-8')
bez replace()
zdaje się powodować to wypluć nawet dziwacznych w znaki \ xc2 na przykład. Czy ktoś może to wyjaśnić?
u''
s zamiast''
s. :-)u' '
zastępowania, a nie' '
. Czy oryginalny ciąg jest Unicode?Odpowiedzi:
\ xa0 jest właściwie niełamiącą spacją w Latin1 (ISO 8859-1), również chr (160). Powinieneś zastąpić go spacją.
string = string.replace(u'\xa0', u' ')
Kiedy .encode ('utf-8'), koduje Unicode do utf-8, co oznacza, że każda Unicode może być reprezentowana przez 1 do 4 bajtów. W tym przypadku \ xa0 jest reprezentowany przez 2 bajty \ xc2 \ xa0.
Przeczytaj na http://docs.python.org/howto/unicode.html .
Uwaga: ta odpowiedź z 2012 roku, Python przeszedł dalej, powinieneś być w stanie
unicodedata.normalize
teraz korzystaćźródło
b'\xa0'
bajt w kodowaniu Latin1, jako dwa bajtyb'\xc2\xa0'
w kodowaniu utf-8. Może być reprezentowany jak
w html.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
.W
unicodedata
bibliotece Pythona znajduje się wiele przydatnych rzeczy . Jednym z nich jest.normalize()
funkcja.Próbować:
Zastąpienie NFKD jedną z innych metod wymienionych w powyższym linku, jeśli nie uzyskasz oczekiwanych rezultatów.
źródło
normalize('NFKD', '1º\xa0dia')
zwrócić „1º dia”, ale zwraca „1o dia”unicodedata.normalize
Spróbuj użyć .strip () na końcu linii, która
line.strip()
działała dla mnie dobrzeźródło
Po wypróbowaniu kilku metod, aby to podsumować, tak to zrobiłem. Poniżej przedstawiono dwa sposoby unikania / usuwania znaków \ xa0 z przeanalizowanego ciągu HTML.
Załóżmy, że mamy nieprzetworzony kod HTML w następujący sposób:
Spróbujmy więc wyczyścić ten ciąg HTML:
Powyższy kod tworzy te znaki \ xa0 w ciągu. Aby usunąć je poprawnie, możemy użyć dwóch sposobów.
Metoda nr 1 (zalecana): pierwsza to metoda get_text firmy BeautifulSoup z argumentem strip jako True, więc nasz kod staje się:
Metoda # 2: Inną opcją jest użycie biblioteki unicodedata biblioteki Pythona
Opisałem również te metody na tym blogu, do których możesz się odnieść.
źródło
Spróbuj tego:
źródło
len(b'\\xa0') == 4
alelen(b'\xa0') == 1
. Jeśli to możliwe; powinieneś naprawić upstream, który generuje te ucieczki.Natknąłem się na ten sam problem podczas pobierania danych z bazy danych sqlite3 za pomocą Pythona. Powyższe odpowiedzi nie działały dla mnie (nie wiem dlaczego), ale tak się
line = line.decode('ascii', 'ignore')
stało : moim celem było jednak usunięcie \ xa0, zamiast zastąpienia ich spacjami.Otrzymałem to z tego bardzo pomocnego tutoriala o Unicode autorstwa Neda Batcheldera.
źródło
'ignore'
jest jak przerzucanie drążka zmiany biegów, nawet jeśli nie rozumiesz, jak działa sprzęgło.str.encode(..., 'ignore')
jest odpowiednikiem obsługi Unicodetry: ... except: ...
. Chociaż może ukryć komunikat o błędzie, rzadko rozwiązuje problem..decode('ascii', 'ignore')
line.decode()
w twojej odpowiedzi sugeruje, że twoje wejście jest bajtowaniem (nie powinieneś wywoływać.decode()
ciągu Unicode (aby go wymusić, metoda została usunięta w Pythonie 3). Nie rozumiem, w jaki sposób można zobaczyć samouczek, który masz połączone w swojej odpowiedzi i pomiń różnicę między bajtami a Unicode (nie mieszaj ich)Skończyłem tutaj, przeglądając problem z postacią, której nie można wydrukować. Używam MySQL
UTF-8
general_ci
i zajmuję się językiem polskim. W przypadku problematycznych ciągów muszę wykonać następujące czynności:Jest to po prostu szybkie obejście problemu i prawdopodobnie powinieneś spróbować czegoś z odpowiednią konfiguracją kodowania.
źródło
text
jest to bajtowanie, które reprezentuje tekst zakodowany za pomocą utf-8. Jeśli pracujesz z tekstem; najpierw zdekoduj go do Unicode (.decode('utf-8')
) i zakoduj do bajtowania tylko na samym końcu (jeśli API nie obsługuje bezpośrednio Unicode npsocket
.). Wszystkie pośrednie operacje na tekście powinny być wykonywane w Unicode.Wypróbuj ten kod
źródło
0xA0 (Unicode) to 0xC2A0 w UTF-8.
.encode('utf8')
po prostu weźmie twój Unicode 0xA0 i zastąpi 0xC2A0 UTF-8. Stąd pojawienie się 0xC2 ... Kodowanie nie zastępuje, jak zapewne teraz się zorientowałeś.źródło
0xc2a0
jest niejednoznaczny (kolejność bajtów).b'\xc2\xa0'
Zamiast tego użyj literału bajtów.Jest to odpowiednik znaku spacji, więc usuń go
źródło
W Beautiful Soup możesz przekazać
get_text()
parametr strip, który usuwa białe znaki od początku i na końcu tekstu. Spowoduje to usunięcie\xa0
lub dowolne inne białe znaki, jeśli wystąpią one na początku lub na końcu łańcucha. Piękna Zupa zastąpiła pusty sznurek\xa0
i to rozwiązało problem.źródło
strip=True
działa tylko wtedy, gdy
jest na początku lub na końcu każdego bitu tekstu. Nie usunie spacji, jeśli znajduje się pomiędzy innymi znakami w tekście.Wersja ogólna z wyrażeniem regularnym (usunie wszystkie znaki kontrolne):
źródło
Python rozpoznaje go jako spację, więc możesz to
split
zrobić bez argumentów i dołączyć normalną spacją:źródło