Saat ini saya menggunakan Beautiful Soup untuk mem-parsing file HTML dan menelepon get_text()
, tetapi sepertinya saya dibiarkan dengan banyak \ xa0 Unicode yang mewakili spasi. Apakah ada cara yang efisien untuk menghapus semuanya di Python 2.7, dan mengubahnya menjadi spasi? Saya kira pertanyaan yang lebih umum, apakah ada cara untuk menghapus pemformatan Unicode?
Saya mencoba menggunakan line = line.replace(u'\xa0',' ')
:, seperti yang disarankan oleh utas lain, tetapi itu mengubah \ xa0 menjadi milik Anda, jadi sekarang saya memiliki "kamu" di mana-mana. ):
EDIT: Masalahnya tampaknya diselesaikan dengan str.replace(u'\xa0', ' ').encode('utf-8')
, tetapi hanya melakukan .encode('utf-8')
tanpa replace()
tampaknya menyebabkannya meludah bahkan lebih aneh karakter, \ xc2 misalnya. Adakah yang bisa menjelaskan ini?
u''
s bukan''
s. :-)u' '
penggantinya, bukan' '
. Apakah string asli satu unicode?Jawaban:
\ xa0 sebenarnya adalah ruang non-breaking dalam Latin1 (ISO 8859-1), juga chr (160). Anda harus menggantinya dengan spasi.
string = string.replace(u'\xa0', u' ')
Ketika .encode ('utf-8'), itu akan menyandikan unicode ke utf-8, itu berarti setiap unicode dapat diwakili oleh 1 hingga 4 byte. Untuk kasus ini, \ xa0 diwakili oleh 2 byte \ xc2 \ xa0.
Baca di http://docs.python.org/howto/unicode.html .
Harap perhatikan: jawaban ini mulai dari tahun 2012, Python telah pindah, Anda seharusnya dapat menggunakannya
unicodedata.normalize
sekarangsumber
b'\xa0'
byte dalam pengkodean latin1, sebagai dua byteb'\xc2\xa0'
dalam pengkodean utf-8. Itu bisa direpresentasikan
dalam html.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
.Ada banyak hal berguna di
unicodedata
perpustakaan Python . Salah satunya adalah.normalize()
fungsinya.Mencoba:
Mengganti NFKD dengan salah satu metode lain yang tercantum dalam tautan di atas jika Anda tidak mendapatkan hasil yang Anda cari.
sumber
normalize('NFKD', '1º\xa0dia')
mengembalikan '1º dia' tetapi mengembalikan '1o dia'unicodedata.normalize
Coba gunakan .strip () di akhir baris Anda
line.strip()
bekerja dengan baik untuk sayasumber
Setelah mencoba beberapa metode, untuk meringkasnya, ini adalah bagaimana saya melakukannya. Berikut ini adalah dua cara untuk menghindari / menghapus \ xa0 karakter dari string HTML yang diuraikan.
Asumsikan kami memiliki html mentah kami sebagai berikut:
Jadi mari kita coba bersihkan string HTML ini:
Kode di atas menghasilkan karakter-karakter ini \ xa0 dalam string. Untuk menghapusnya dengan benar, kita dapat menggunakan dua cara.
Metode # 1 (Disarankan): Yang pertama adalah metode get_text BeautifulSoup dengan argumen strip sebagai True Jadi kode kita menjadi:
Metode # 2: Opsi lainnya adalah menggunakan pustaka unicodedata python
Saya juga telah merinci metode ini di blog ini yang mungkin ingin Anda rujuk.
sumber
coba ini:
sumber
len(b'\\xa0') == 4
tetapilen(b'\xa0') == 1
. Jika memungkinkan; Anda harus memperbaiki hulu yang menghasilkan pelarian ini.Saya mengalami masalah yang sama menarik beberapa data dari database sqlite3 dengan python. Jawaban di atas tidak bekerja untuk saya (tidak yakin mengapa), tetapi ini berhasil:
line = line.decode('ascii', 'ignore')
Namun, tujuan saya menghapus \ xa0s, alih-alih menggantinya dengan spasi.Saya mendapatkan ini dari tutorial unicode yang sangat membantu oleh Ned Batchelder.
sumber
'ignore'
seperti mendorong melalui tongkat persneling meskipun Anda tidak mengerti bagaimana kopling bekerja ..str.encode(..., 'ignore')
adalah setara dengan penanganan Unicodetry: ... except: ...
. Meskipun mungkin menyembunyikan pesan kesalahan, itu jarang menyelesaikan masalah..decode('ascii', 'ignore')
line.decode()
dalam jawaban Anda menunjukkan bahwa input Anda adalah bytestring (Anda tidak boleh memanggil.decode()
string Unicode (untuk menegakkannya, metode ini dihapus dengan Python 3). Saya tidak mengerti bagaimana mungkin melihat tutorial yang telah Anda buat ditautkan dalam jawaban Anda dan lewatkan perbedaan antara byte dan Unicode (jangan campur mereka)Saya berakhir di sini sambil mencari masalah dengan karakter yang tidak dapat dicetak. Saya menggunakan MySQL
UTF-8
general_ci
dan berurusan dengan bahasa Polandia. Untuk string yang bermasalah saya harus melakukan sebagai berikut:Ini hanya solusi cepat dan Anda mungkin harus mencoba sesuatu dengan pengaturan penyandian yang tepat.
sumber
text
bytestring yang mewakili teks yang dikodekan menggunakan utf-8. Jika Anda bekerja dengan teks; decode ke Unicode terlebih dahulu (.decode('utf-8')
) dan encode ke bytestring hanya di akhir (jika API tidak mendukung Unicode secara langsung misalnya,socket
). Semua operasi perantara pada teks harus dilakukan pada Unicode.Coba kode ini
sumber
0xA0 (Unicode) adalah 0xC2A0 di UTF-8.
.encode('utf8')
hanya akan mengambil Unicode 0xA0 Anda dan ganti dengan 0xC2A0 UTF-8. Oleh karena itu kemunculan 0xC2s ... Pengkodean tidak menggantikan, seperti yang mungkin Anda sadari sekarang.sumber
0xc2a0
ambigu (urutan byte). Gunakanb'\xc2\xa0'
byte literal sebagai gantinya.Ini setara dengan karakter ruang, jadi lepaskan
sumber
Dalam Beautiful Soup, Anda dapat melewatkan
get_text()
parameter strip, yang menghapus spasi ruang putih dari awal dan akhir teks. Ini akan menghapus\xa0
atau spasi putih lainnya jika itu terjadi pada awal atau akhir string. Sup yang indah menggantikan string kosong dengan\xa0
dan ini memecahkan masalah bagi saya.sumber
strip=True
hanya berfungsi jika
berada di awal atau akhir setiap bit teks. Ini tidak akan menghapus spasi jika tidak ada di antara karakter lain dalam teks.Versi generik dengan ekspresi reguler (Ini akan menghapus semua karakter kontrol):
sumber
Python mengenalinya seperti karakter spasi, jadi Anda bisa
split
melakukannya tanpa args dan bergabung dengan spasi putih normal:sumber