String Python dicetak sebagai [u'String ']

142

Ini pasti akan mudah, tapi itu benar-benar menggangguku.

Saya memiliki skrip yang berbunyi di halaman web dan menggunakan Beautiful Soup untuk menguraikannya. Dari sup, saya mengekstrak semua tautan karena tujuan akhir saya adalah mencetak tautan.

Semua teks yang saya uraikan adalah ASCII. Saya tahu bahwa Python memperlakukan string sebagai unicode, dan saya yakin ini sangat berguna, tidak ada gunanya dalam skrip wee saya.

Setiap kali saya pergi untuk mencetak variabel yang memegang 'String' saya [u'String']dicetak ke layar. Apakah ada cara sederhana untuk mengembalikan ini ke ascii atau haruskah saya menulis regex untuk menghapusnya?

gnuchu
sumber
kemungkinan duplikat dari pertanyaan yang jauh lebih jelas (dan jawaban): stackoverflow.com/q/2464959/1390788
Terrabits
Apakah ini menjawab pertanyaan Anda? Apa awalan u dalam string Python?
Terrabits

Jawaban:

118

[u'ABC']akan menjadi daftar satu elemen dari string unicode. Beautiful Soup selalu menghasilkan Unicode . Jadi, Anda perlu mengonversi daftar ke string unicode tunggal, dan kemudian mengonversi itu menjadi ASCII.

Saya tidak tahu persis bagaimana Anda mendapatkan daftar satu elemen; anggota konten akan menjadi daftar string dan tag, yang tampaknya bukan milik Anda. Dengan asumsi bahwa Anda benar-benar selalu mendapatkan daftar dengan elemen tunggal, dan bahwa tes Anda benar-benar hanya ASCII Anda akan menggunakan ini:

 soup[0].encode("ascii")

Namun, harap periksa kembali apakah data Anda benar-benar ASCII. Ini sangat jarang. Jauh lebih mungkin itu latin-1 atau utf-8.

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


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

Atau Anda bertanya kepada Beautiful Soup apa penyandian aslinya dan mendapatkannya kembali dalam penyandian ini:

 soup[0].encode(soup.originalEncoding)
Oefe
sumber
6
Anda sebenarnya tidak perlu melakukan encoding, karena OP hanya melihat string repr karena itulah cara Anda melihat sesuatu ketika Anda mencetak daftar. sup [0] akan cukup untuk menunjukkan str bukan repr, menunjukkan isi string dan bukan kutipan dan pengubah unicode.
ironfroggy
2
Anda tidak boleh menyandikan teks yang direpresentasikan sebagai Unicode ke byte dalam banyak kasus: Anda harus mencetak Unicode langsung dengan Python:print(', '.join([u'ABC' , u'...']))
jfs
26

Anda mungkin memiliki daftar yang berisi satu string unicode. Ini repradalah [u'String'].

Anda dapat mengonversikan ini ke daftar string byte menggunakan variasi berikut ini:

# 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)
ddaa
sumber
1
Tolong, hindari kengerian seperti repr(x).lstrip('u')[1:-1]. Gunakan sesuatu seperti: print ", ".join(my_list)sebagai gantinya, untuk memformat daftar string Unicode.
jfs
1
Komentar itu mengatakan, "Itu sebenarnya bukan cara yang baik untuk melakukannya". Itu hanya di sini untuk lolz!
ddaa
9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

akan dicetak

{'name': 'A', 'primary_key': 1}
osmjit
sumber
1
metode ini terlihat cukup manis bagiku, mengapa tidak ada suara? Adakah dampak kinerja yang harus kita khawatirkan?
jrich523
8

Jika mengakses / mencetak daftar elemen tunggal (misalnya, berurutan atau difilter):

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
gevang
sumber
1
Anda melakukan pemahaman daftar:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang
4

meneruskan fungsi output ke str () dan itu akan menghapus konversi keluaran unicode. juga dengan mencetak output, itu akan menghapus tag u 'dari itu.

waweru
sumber
4

[u'String'] adalah representasi teks dari daftar yang berisi string Unicode pada Python 2.

Jika Anda menjalankan print(some_list)maka itu setara dengan
print'[%s]' % ', '.join(map(repr, some_list))yaitu, untuk membuat representasi teks dari objek Python dengan tipe list,repr() fungsi dipanggil untuk setiap item.

Jangan bingung objek Python dan representasi teksnya - repr('a') != 'a'dan bahkan representasi teks representasi teks berbeda:repr(repr('a')) != repr('a') .

repr(obj)mengembalikan string yang berisi representasi objek yang dapat dicetak. Tujuannya adalah untuk menjadi representasi yang jelas dari suatu objek yang dapat berguna untuk debugging, dalam REPL. Seringeval(repr(obj)) == obj .

Untuk menghindari panggilan repr(), Anda dapat mencetak item daftar secara langsung (jika semuanya adalah string Unicode) misalnya:print ",".join(some_list) —itu mencetak daftar string yang dipisahkan koma:String

Jangan meng-encode string Unicode ke byte menggunakan pengkodean karakter hardcoded, cetak Unicode langsung sebagai gantinya. Jika tidak, kode mungkin gagal karena pengkodean tidak dapat mewakili semua karakter misalnya, jika Anda mencoba menggunakan 'ascii'pengkodean dengan karakter non-ascii. Atau kode secara diam-diam menghasilkan mojibake (data yang rusak diteruskan lebih jauh dalam pipa) jika lingkungan menggunakan pengkodean yang tidak sesuai dengan pengkodean hardcoded.

jfs
sumber
3

Gunakan diratautype pada 'string' untuk mencari tahu apa itu. Saya menduga itu salah satu objek tag BeautifulSoup, yang dicetak seperti string, tetapi sebenarnya bukan satu. Jika tidak, ini ada di dalam daftar dan Anda perlu mengonversi setiap string secara terpisah.

Bagaimanapun, mengapa Anda keberatan menggunakan Unicode? Ada alasan khusus?

sykora
sumber
Saya telah melihat BeautifulSoup sejak beberapa hari terakhir. Saya tidak tahu bagaimana gnuchu akan mendapatkan Anda ['string'] bukan [u'String ']. Komentarnya kepada Andrew Jaffe tampaknya membuktikan itu adalah daftar.
batbrat
3

Apakah Anda benar-benar jahat? u'String' ?

Bagaimanapun, tidak bisakah Anda hanya melakukan str(string)untuk mendapatkan string daripada unicode-string? (Ini harus berbeda untuk Python 3, yang semua string unicode.)

Andrew Jaffe
sumber
Aku seharusnya lebih jelas. Saya menggunakan str () tetapi masih mendapatkan output seperti di bawah ini ketika saya mencetak. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Data dilucuti sebagai teks dari halaman web, kemudian dimasukkan ke dalam basis data (Google Appstore), kemudian diambil dan dicetak.
gnuchu
-1

encode("latin-1") membantu saya dalam kasus saya:

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

Mungkin saya tidak mengerti, mengapa Anda tidak mendapatkan element.text lalu mengonversinya sebelum menggunakannya? misalnya (tidak tahu mengapa Anda melakukan ini tetapi ...) cari semua elemen label halaman web dan beralih di antara mereka sampai Anda menemukan satu yang disebut MyText

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

Konversikan string dari saya dan lakukan apa pun yang ingin Anda lakukan ... mungkin saya kehilangan sesuatu di pesan aslinya? atau ini yang kamu cari?

Steven
sumber
Anda melewatkan bagian di mana pertanyaannya adalah tentang bagaimana melakukan "Konversi string dari saya".
Nathan Tuggy
ahhh, terima kasih dari semua komentar yang saya pikir masalahnya adalah mendapatkan nilai untuk dikonversi
Steven
tetapi untuk menjadi adil i.text adalah nilai string aktual, tidak perlu "menariknya keluar dari array" seperti beberapa orang menyarankan jika label elemet misalnya memiliki nilai teks [u'String '] i.text akan menjadi String
Steven