Python dizesi [u'String '] olarak yazdırılıyor


142

Bu kesinlikle kolay olacak ama gerçekten beni rahatsız ediyor.

Bir web sayfasında okur ve ayrıştırmak için güzel çorba kullanan bir komut dosyası var . Gönderen çorbası benim nihai hedef link.contents yazdırmak olduğu gibi tüm bağlantıları ayıklamak.

Ayrıştırdığım tüm metin ASCII. Python'un dizeleri unicode olarak ele aldığını biliyorum ve bunun çok kullanışlı olduğundan eminim.

'String'i tutan bir değişkeni yazdırmaya her gittiğimde [u'String']ekrana yazdırılıyorum. Bunu sadece ascii'ye geri almanın basit bir yolu var mı yoksa onu soymak için bir regex yazmalı mıyım?


çok daha açık bir şekilde ifade edilen sorunun (ve cevabın) olası kopyası: stackoverflow.com/q/2464959/1390788
Terrabits

Bu sorunuza cevap veriyor mu? Python dizesindeki u öneki nedir?
Terrabits

Yanıtlar:


118

[u'ABC']unicode dizelerinin tek elemanlı bir listesi olur. Güzel Çorba daima Unicode üretir . Bu nedenle, listeyi tek bir unicode dizesine dönüştürmeniz ve ardından bunu ASCII'ye dönüştürmeniz gerekir.

Tek element listelerini nasıl aldığınızı tam olarak bilmiyorum; içerik üyesi, görünüşte sahip olduğunuz gibi olmayan dizelerin ve etiketlerin bir listesi olacaktır. Her zaman tek bir öğe içeren bir liste aldığınızı ve testinizin gerçekten sadece ASCII olduğunu varsayarsak, bunu kullanırsınız:

 soup[0].encode("ascii")

Ancak, lütfen verilerinizin gerçekten ASCII olup olmadığını iki kez kontrol edin. Bu oldukça nadirdir. Çok daha büyük olasılıkla latin-1 veya utf-8.

 soup[0].encode("latin-1")


 soup[0].encode("utf-8")

Veya Beautiful Soup'a orijinal kodlamanın ne olduğunu sorarsınız ve bu kodlamada geri alırsınız:

 soup[0].encode(soup.originalEncoding)

6
Aslında kodlamayı yapmak zorunda değilsiniz, çünkü OP sadece dize repr'yi görüyor, çünkü bir liste yazdırdığınızda bir şey görüyorsunuz. çorba [0], repr yerine str'yi göstermek için yeterli olacaktır, alıntı ve unicode değiştiriciyi değil, dizenin içeriğini gösterecektir.
ironfroggy

2
Çoğu durumda Unicode olarak temsil edilen metni baytlara kodlamamalısınız: Unicode'u doğrudan Python'da yazdırmalısınız:print(', '.join([u'ABC' , u'...']))
jfs

26

Muhtemelen bir unicode dizesi içeren bir listeniz vardır. reprBu taşımaktadır [u'String'].

Aşağıdakilerin herhangi bir varyasyonunu kullanarak bunu bayt dizeleri listesine dönüştürebilirsiniz:

# Functional style.
print map(lambda x: x.encode('ascii'), my_list)

# List comprehension.
print [x.encode('ascii') for x in my_list]

# Interesting if my_list may be a tuple or a string.
print type(my_list)(x.encode('ascii') for x in my_list)

# What do I care about the brackets anyway?
print ', '.join(repr(x.encode('ascii')) for x in my_list)

# That's actually not a good way of doing it.
print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list)

1
Lütfen, gibi dehşet kaçının repr(x).lstrip('u')[1:-1]. print ", ".join(my_list)Unicode dizelerinin listesini biçimlendirmek için : gibi bir şey kullanın .
jfs

1
Yorum, "Bu aslında bunu yapmanın iyi bir yolu değil" diyor. Sadece lolz için burada!
ddaa

9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

yazdıracak

{'name': 'A', 'primary_key': 1}

1
bu yöntem benim için çok tatlı görünüyor, neden oy yok? endişelenmemiz gereken herhangi bir performans etkisi?
jrich523

8

Tek elemanlı listelere erişiyor / yazdırıyorsa (örneğin, sıralı veya filtreli):

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]

1
bir liste kavrama yapmak:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang

4

çıkışı str () işlevine geçirir ve unicode çıktıyı dönüştürür. Ayrıca çıktıyı yazdırarak u '' etiketlerini de kaldıracaktır.


4

[u'String'] Python 2'de Unicode dizesi içeren listenin metin temsilidir.

Çalıştırırsanız print(some_list),
print'[%s]' % ', '.join(map(repr, some_list))yani, türüyle bir Python nesnesinin metin temsilini oluşturmak eşdeğerdir list, repr()işlev her öğe için çağrılır.

Python nesne ve metin gösterimi karıştırmayın - repr('a') != 'a've metin gösterimi farklıdır hatta metin gösterimi: repr(repr('a')) != repr('a').

repr(obj)bir nesnenin yazdırılabilir bir temsilini içeren bir dize döndürür. Amacı, bir REPL'de hata ayıklama için yararlı olabilecek bir nesnenin açık bir temsili olmaktır. Genellikle eval(repr(obj)) == obj.

Aramadan kaçınmak için repr(), liste öğelerini doğrudan yazdırabilirsiniz (tümü Unicode dizeleriyse) örn .:: dizelerin print ",".join(some_list)virgülle ayrılmış bir listesini yazdırır:String

Sabit kodlu karakter kodlaması kullanarak bir Unicode dizesini baytlara kodlamayın, bunun yerine doğrudan Unicode yazdırın . Aksi takdirde, kodlama tüm karakterleri temsil edemediğinden, örneğin 'ascii'ascii olmayan karakterlerle kodlamayı kullanmaya çalışırsanız kod başarısız olabilir . Veya ortam sabit kodlanmış kodlama ile uyumlu olmayan bir kodlama kullanıyorsa, kod sessizce mojibake üretir (bir veri hattında bozuk veriler daha fazla iletilir).


3

Kullanım dirveya type'string' üzerine ne olduğunu öğrenmek için. Bunun bir string gibi basılan BeautifulSoup'un etiket nesnelerinden biri olduğundan şüpheleniyorum, ama gerçekten bir tane değil. Aksi takdirde, bir liste içinde ve her dizeyi ayrı ayrı dönüştürmeniz gerekir.

Her durumda, neden Unicode kullanmaya itiraz ediyorsunuz? Belirli bir nedeni var mı?


Son birkaç gündür BeautifulSoup'a bakıyorum. Gnuchu'nun nasıl u ['string'] elde edemeyeceğini anlayamadım [u'String ']. Andrew Jaffe'ye yaptığı yorum, bunun bir liste olduğunu kanıtlıyor gibi görünüyor.
batbrat

3

Gerçekten u'String'mi demek istiyorsun ?

Her halükarda, str(string)unicode-string yerine bir string elde edemez misiniz ? (Bu, tüm dizelerin unicode olduğu Python 3 için farklı olmalıdır.)


Daha açık olmalıydım. Str () kullanıyorum ancak yazdırdığımda hala aşağıdaki gibi çıktı alıyorum. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Veriler bir web sayfasından metin olarak çıkarılır, daha sonra bir veritabanına (Google Appstore) eklenir, sonra alınır ve yazdırılır.
gnuchu

-1

encode("latin-1") benim durumumda bana yardımcı oldu:

facultyname[0].encode("latin-1")

-1

Belki anlamıyorum, neden element.text'i alıp kullanmadan önce dönüştüremiyorsunuz? örneğin (bunu neden yapacağınızı bilmiyorum ama ...) web sayfasının tüm etiket öğelerini bulun ve MyText adlı birini bulana kadar aralarında yineleyin

        avail = []
        avail = driver.find_elements_by_class_name("label");
        for i in avail:
                if  i.text == "MyText":

İ dizesini dönüştürmek ve ne yapmak istersen yap ... belki orijinal mesajda bir şey eksik? ya da aradığınız bu muydu?


Sorunun "Dizeyi i'den dönüştür" işleminin nasıl yapılacağı ile ilgili bölümü kaçırıyorsunuz .
Nathan Tuggy

ahhh, tüm yorumlardan dolayı sorunun dönüştürülecek değeri elde ettiğini düşündüm
Steven

ancak dürüst olmak gerekirse, i.text gerçek dize değeridir, örneğin etiket elemet'in [u'String '] i.text metin değerine sahip olması durumunda, bazı insanlar tarafından önerilen "diziden dışarı çekmeye" gerek yoktur. String olacak
Steven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.