web-dev-qa-db-ja.com

Python:文字列から\ xa0を削除しますか?

私は現在HTMLファイルの解析にBeautiful Soupを使用していてget_text()を呼び出していますが、スペースを表す多くの\ xa0 Unicodeが残っているようです。 Python 2.7でそれらすべてを削除し、それらをスペースに変更する効率的な方法はありますか?私はもっ​​と一般化された質問であろうと思います、ユニコードフォーマットを取り除く方法はありますか?

私は別のスレッドで示唆されているように:line = line.replace(u'\xa0',' ')を使用しようとしました、しかしそれは\ xa0をuに変えました、それで今私は代わりにどこでも "u"を持っています。 ):

編集:問題はstr.replace(u'\xa0', ' ').encode('utf-8')によって解決されるようですが、.encode('utf-8')なしでreplace()を実行することはそれより奇妙な文字、例えば\ xc2を吐き出すように思われるようです。誰もがこれを説明できますか?

186
zhuyxn

\ xa0はLatin 1(ISO 8859-1)では実際には改行なしのスペースで、chr(160)でもあります。スペースに置き換えてください。

string = string.replace(u'\xa0', u' ')

.encode( 'utf-8')の場合、Unicodeをutf-8にエンコードします。つまり、すべてのUnicodeを1〜4バイトで表すことができます。この場合、\ xa0は2バイトの\ xc2\xa0で表されます。

http://docs.python.org/howto/unicode.html を読んでください。

注意してください:2012年からのこの答えでは、Pythonが進んでいる、あなたは今unicodedata.normalizeを使用することができるはずです

205
samwize

Pythonのunicodedataライブラリにはたくさんの便利なことがあります。そのうちの1つが .normalize() 関数です。

試してください:

new_str = unicodedata.normalize("NFKD", unicode_str)

期待通りの結果が得られない場合は、上記のリンクにリストされている他の方法のいずれかでNFKDを置き換えてください。

162
Jamie

あなたの行の最後で.strip()を使ってみてくださいline.strip()は私にはうまくいきました

15
user3590113

私はpythonでsqlite3データベースからいくつかのデータを引き出すという同じ問題に遭遇しました。上記の答えは私にはうまくいきませんでしたが(なぜかわかりませんが)、line = line.decode('ascii', 'ignore')しかし、私の目標は\ xa0sを削除することでした。スペースで置き換えるのではなく。

私はこれをNed Batchelderによる このとても役に立つUnicodeチュートリアルから得ました。

12
user1774699

これを試して:

string.replace('\\xa0', ' ')
11
user278064

印刷できない文字に関する問題をGoogleで調べながら、ここで終わります。私はMySQLのUTF-8general_ciを使い、ポーランド語を扱います。問題のある文字列の場合は、次のように処理しなければなりません。

text=text.replace('\xc2\xa0', ' ')

それはただの素早い回避策であり、正しいエンコーディング設定で何かを試すべきです。

8
andilabs

このコードを試す

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
7
shiva

いくつかの方法を試した後、要約すると、これが私のやり方です。以下は、解析されたHTML文字列から\ xa0文字を回避/削除する2つの方法です。

次のように生のHTMLがあるとします。

raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'

それでは、このHTML文字列をきれいにしてみましょう:

from bs4 import BeautifulSoup
raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'
text_string = BeautifulSoup(raw_html, "lxml").text
print text_string
#u'Dear Parent,\xa0This is a test message,\xa0kindly ignore it.\xa0Thanks'

上記のコードでは、文字列内にこれらの文字\ xaが生成されます。それらを正しく削除するには、2つの方法があります。

方法#1(推奨):最初の方法はBeautifulSoupのget_text引数をTrueにするという方法です。

clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True)
print clean_text
# Dear Parent,This is a test message,kindly ignore it.Thanks

方法#2:他の方法はpythonのライブラリunicodedataを使うことです

import unicodedata
text_string = BeautifulSoup(raw_html, "lxml").text
clean_text = unicodedata.normalize("NFKD",text_string)
print clean_text
# u'Dear Parent,This is a test message,kindly ignore it.Thanks'

私はまたこれらの方法を詳述しました このブログで あなたが参照したいと思うかもしれません。

5

0xA0(Unicode)は、UTF-8では0xC2A0です。 .encode('utf8')はあなたのUnicode 0xA0をそのまま取り、UTF-8の0xC2A0に置き換えます。そのため、0xC2sの登場です。エンコーディングは置き換えられていません。おそらく、すでに気づいているはずです。

4
dda

Beautiful Soupでは、テキストの始めと終わりから空白を取り除くstripパラメータにget_text()を渡すことができます。文字列の先頭または末尾に\xa0またはその他の空白がある場合、これは削除されます。 Beautiful Soupは空の文字列を\xa0に置き換えました。これで問題は解決しました。

mytext = soup.get_text(strip=True)
1
Mark

正規表現付きの総称バージョン(すべての制御文字を削除します):

import re
def remove_control_chart(s):
    return re.sub(r'\\x..', '', s)
1
ranaFire

Pythonはそれをスペース文字のように認識するので、引数なしでそれをsplitにして、通常の空白で結合することができます。

line = ' '.join(line.split())
0
Jonhy Beebop

これはスペース文字と同等なので、削除します

print(string.strip()) # no more xa0
0
8bitjunkie