2016-11-29 5 views
6

Мне нужно заменить в строке символ« »» пробелом, но я все равно получаю сообщение об ошибке. Это код, я использую:Python - Заменить символ не-ascii в строке (»)

# -*- coding: utf-8 -*- 
from bs4 import BeautifulSoup 

# other code 

soup = BeautifulSoup(data, 'lxml') 
mystring = soup.find('a').text.replace(' »','') 

UnicodeEncodeError: 'ascii' codec can't encode character u'\xbb' in position 13: ordinal not in range(128)

Но если я проверить его с этим другим скриптом:

# -*- coding: utf-8 -*- 
a = "hi »" 
b = a.replace('»','') 

Он работает. Почему это?

+1

googling ошибка, которую вы получаете как есть, я получаю это обратно: http://stackoverflow.com/questions/5141559/unicodeencodeerror-ascii-codec-cant-encode-characteru-u-xef-in-position-0 Там должно быть что-то, что вы можете использовать –

ответ

8

Для замены содержимого строки с использованием метода str.replace(); Вы должны в первую очередь декодировать строку, а затем заменить текст и кодировать его обратно к исходному тексту:

>>> a = "hi »" 
>>> a.decode('utf-8').replace("»".decode('utf-8'), "").encode('utf-8') 
'hi ' 

Вы также можете использовать следующее регулярное выражение, чтобы удалить все символы не-ASCII из строки:

>>> import re 
>>> re.sub(r'[^\x00-\x7f]',r'', 'hi »') 
'hi ' 
ответ
2

@Moinuddin Quadri вписывается ваш потребительной случай лучше, но в целом, простой способ удаления не-ASCII символы из данной строки, делая следующее:

# the characters '¡' and '¢' are non-ASCII 
string = "hello, my name is ¢arl... ¡Hola!" 

all_ascii = ''.join(char for char in string if ord(char) < 128) 

Этот Результаты в:

>>> print(all_ascii) 
"hello, my name is arl... Hola!" 

Вы также можете сделать это:

''.join(filter(lambda c: ord(c) < 128, string)) 

Но это около 30% медленнее, чем char for char ... подхода.

Смежные вопросы