私は現在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を吐き出すように思われるようです。誰もがこれを説明できますか?
\ 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
を使用することができるはずです
Pythonのunicodedata
ライブラリにはたくさんの便利なことがあります。そのうちの1つが .normalize()
関数です。
試してください:
new_str = unicodedata.normalize("NFKD", unicode_str)
期待通りの結果が得られない場合は、上記のリンクにリストされている他の方法のいずれかでNFKDを置き換えてください。
あなたの行の最後で.strip()を使ってみてくださいline.strip()
は私にはうまくいきました
私はpythonでsqlite3データベースからいくつかのデータを引き出すという同じ問題に遭遇しました。上記の答えは私にはうまくいきませんでしたが(なぜかわかりませんが)、line = line.decode('ascii', 'ignore')
しかし、私の目標は\ xa0sを削除することでした。スペースで置き換えるのではなく。
私はこれをNed Batchelderによる このとても役に立つUnicodeチュートリアルから得ました。
これを試して:
string.replace('\\xa0', ' ')
印刷できない文字に関する問題をGoogleで調べながら、ここで終わります。私はMySQLのUTF-8
general_ci
を使い、ポーランド語を扱います。問題のある文字列の場合は、次のように処理しなければなりません。
text=text.replace('\xc2\xa0', ' ')
それはただの素早い回避策であり、正しいエンコーディング設定で何かを試すべきです。
このコードを試す
import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
いくつかの方法を試した後、要約すると、これが私のやり方です。以下は、解析された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'
私はまたこれらの方法を詳述しました このブログで あなたが参照したいと思うかもしれません。
0xA0(Unicode)は、UTF-8では0xC2A0です。 .encode('utf8')
はあなたのUnicode 0xA0をそのまま取り、UTF-8の0xC2A0に置き換えます。そのため、0xC2sの登場です。エンコーディングは置き換えられていません。おそらく、すでに気づいているはずです。
Beautiful Soupでは、テキストの始めと終わりから空白を取り除くstripパラメータにget_text()
を渡すことができます。文字列の先頭または末尾に\xa0
またはその他の空白がある場合、これは削除されます。 Beautiful Soupは空の文字列を\xa0
に置き換えました。これで問題は解決しました。
mytext = soup.get_text(strip=True)
正規表現付きの総称バージョン(すべての制御文字を削除します):
import re
def remove_control_chart(s):
return re.sub(r'\\x..', '', s)
Pythonはそれをスペース文字のように認識するので、引数なしでそれをsplit
にして、通常の空白で結合することができます。
line = ' '.join(line.split())
これはスペース文字と同等なので、削除します
print(string.strip()) # no more xa0