Z pewnością będzie to łatwe, ale naprawdę mnie to niepokoi.
Mam skrypt, który czyta stronę internetową i analizuje ją za pomocą Beautiful Soup . Z zupy wyciągam wszystkie linki, moim ostatecznym celem jest wydrukowanie linku.contents.
Cały tekst, który analizuję, to ASCII. Wiem, że Python traktuje ciągi znaków jako Unicode i jestem pewien, że jest to bardzo przydatne, po prostu bezużyteczne w moim małym skrypcie.
Za każdym razem, gdy idę wydrukować zmienną zawierającą „String”, [u'String']
pojawia się na ekranie. Czy istnieje prosty sposób na przywrócenie tego z powrotem do samego ascii, czy powinienem napisać wyrażenie regularne, aby je usunąć?
Odpowiedzi:
[u'ABC']
byłaby jednoelementową listą ciągów znaków Unicode. Beautiful Soup zawsze tworzy Unicode . Musisz więc przekonwertować listę na pojedynczy ciąg znaków Unicode, a następnie przekonwertować go na ASCII.Nie wiem dokładnie, skąd masz listy jednoelementowe; składnikiem zawartości byłaby lista ciągów i tagów, co najwyraźniej nie jest tym, co masz. Zakładając, że naprawdę zawsze otrzymujesz listę z jednym elementem i że twój test to tak naprawdę tylko ASCII, użyjesz tego:
Jednak sprawdź dokładnie, czy Twoje dane to naprawdę ASCII. To jest dość rzadkie. O wiele bardziej prawdopodobne jest, że jest to latin-1 lub utf-8.
Albo zapytasz Beautiful Soup, jakie było oryginalne kodowanie i odzyskaj je w tym kodowaniu:
źródło
print(', '.join([u'ABC' , u'...']))
Prawdopodobnie masz listę zawierającą jeden ciąg znaków Unicode. To
repr
jest to[u'String']
.Możesz przekonwertować to na listę ciągów bajtów, używając dowolnej odmiany z poniższych:
źródło
repr(x).lstrip('u')[1:-1]
.print ", ".join(my_list)
Zamiast tego użyj czegoś takiego jak :, aby sformatować listę ciągów Unicode.wydrukuje
źródło
W przypadku uzyskiwania dostępu / drukowania list pojedynczych elementów (np. Sekwencyjnych lub filtrowanych):
źródło
my_list = [str(my_list[x]) for x in range(len(my_list))]
przekaż dane wyjściowe do funkcji str (), co usunie konwersję wyjścia Unicode. również drukując wynik, usunie z niego tagi u ''.
źródło
[u'String']
jest tekstową reprezentacją listy zawierającej ciąg znaków Unicode w Pythonie 2.Jeśli uruchomisz,
print(some_list)
jest to równoważne zprint'[%s]' % ', '.join(map(repr, some_list))
np. Utworzeniem reprezentacji tekstowej obiektu Pythona z typemlist
,repr()
funkcja jest wywoływana dla każdego elementu.Nie należy mylić obiekt Pythona i jego reprezentację tekstową -
repr('a') != 'a'
a nawet reprezentacji tekstowy różni reprezentacji tekst:repr(repr('a')) != repr('a')
.repr(obj)
zwraca ciąg zawierający drukowalną reprezentację obiektu. Jego celem jest niedwuznaczna reprezentacja obiektu, który może być przydatny do debugowania w REPL. Częstoeval(repr(obj)) == obj
.Aby uniknąć wywoływania
repr()
, możesz wydrukować elementy listy bezpośrednio (jeśli wszystkie są łańcuchami Unicode), np .:print ",".join(some_list)
—wypisuje listę ciągów oddzielonych przecinkami:String
Nie koduj ciągu znaków Unicode do bajtów przy użyciu zakodowanego na stałe kodowania znaków, zamiast tego drukuj bezpośrednio Unicode . W przeciwnym razie kod może się nie powieść, ponieważ kodowanie nie może reprezentować wszystkich znaków, np. Jeśli spróbujesz użyć
'ascii'
kodowania ze znakami spoza ASCII. Albo kod po cichu tworzy mojibake (uszkodzone dane są przekazywane dalej w potoku), jeśli środowisko używa kodowania, które jest niezgodne z kodowaniem zakodowanym na stałe.źródło
Użyj
dir
lubtype
na 'string', aby dowiedzieć się, co to jest. Podejrzewam, że jest to jeden z obiektów tagów BeautifulSoup, który drukuje jak ciąg, ale tak naprawdę nim nie jest. W przeciwnym razie znajduje się wewnątrz listy i musisz konwertować każdy ciąg oddzielnie.W każdym razie, dlaczego sprzeciwiasz się używaniu Unicode? Z jakiegoś konkretnego powodu?
źródło
Naprawdę masz na myśli
u'String'
?W każdym razie, czy nie możesz po prostu zrobić
str(string)
ciągu znaków zamiast łańcucha znaków Unicode? (Powinno to wyglądać inaczej dla Pythona 3, dla którego wszystkie ciągi znaków są w formacie Unicode).źródło
encode("latin-1")
pomogło mi w moim przypadku:źródło
Może nie rozumiem, dlaczego nie możesz po prostu pobrać elementu.text i przekonwertować go przed użyciem? na przykład (nie wiem, dlaczego miałbyś to zrobić, ale ...) znajdź wszystkie elementy etykiety na stronie internetowej i iteruj między nimi, aż znajdziesz jeden o nazwie MyText
Przekonwertuj ciąg z i i zrób wszystko, co chcesz ... może brakuje mi czegoś w oryginalnej wiadomości? czy to było to, czego szukałeś?
źródło