2016-11-29 29 views
6

Tôi cần thay thế trong chuỗi ký tự" »" bằng khoảng trắng, nhưng tôi vẫn gặp lỗi. Đây là mã tôi sử dụng:Python - Thay thế ký tự không phải ascii thành chuỗi (»)

# -*- 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)

Nhưng Nếu tôi thử nghiệm nó với kịch bản này khác:

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

Nó hoạt động. Tại sao lại thê nay?

+1

googling lỗi bạn nhận được như nó có, tôi nhận được điều này trở lại: http://stackoverflow.com/questions/5141559/unicodeencodeerror-ascii-codec-cant-encode-character-u-xef-in-position-0 Nên có một cái gì đó ở đó bạn có thể sử dụng –

Trả lời

8

Để thay thế nội dung của chuỗi bằng phương pháp str.replace(); bạn cần phải đầu tiên giải mã chuỗi, sau đó thay thế các văn bản và mã hóa nó trở lại văn bản gốc:

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

Bạn cũng có thể sử dụng regex sau để loại bỏ tất cả các ký tự khác ASCII từ chuỗi:

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

@Moinuddin Quadri của câu trả lời phù hợp use-case của bạn tốt hơn, nhưng nhìn chung, một cách dễ dàng để loại bỏ các ký tự ASCII từ một chuỗi cho trước là bằng cách làm như sau:

# 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) 

này kết quả trong:

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

Bạn cũng có thể làm điều này:

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

Nhưng đó là chậm hơn so với phương pháp char for char ... khoảng 30%.

Các vấn đề liên quan