2016-11-29 21 views
6

文字「»」を空白で置き換える必要がありますが、まだエラーが発生します。これは私が使用するコードです:Python - 文字列内の非アスキー文字を置換する(»)

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

グーグルがそのままの状態で取得した場合、私はこれを返す:http://stackoverflow.com/questions/5141559/unicodeencodeerror-ascii-codec-cant-encode-character-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四の答えは、より良いあなたのユースケースに収まるが、一般的に、与えられた文字列から非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) 

こので結果:

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

をしかし、それはchar for char ...アプローチよりも約30%遅いです:

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

あなたもこれを行うことができます。

関連する問題