Python:从字符串中删除\ xa0?

时间:2012-06-12 09:12:33

标签: python parsing unicode

我目前正在使用Beautiful Soup来解析HTML文件并调用get_text(),但似乎我留下了很多代表空格的\ xa0 Unicode。有没有一种有效的方法可以在Python 2.7中删除所有这些,并将它们更改为空格?我想更普遍的问题是,有没有办法删除Unicode格式?

我尝试使用:line = line.replace(u'\xa0',' '),正如另一个线程所建议的那样,但是将\ xa0改为u,所以现在我到处都是“u”。 ):

编辑:str.replace(u'\xa0', ' ').encode('utf-8')似乎解决了这个问题,但只是在没有.encode('utf-8')的情况下执行replace()似乎会导致它甚至吐出更奇怪的字符,例如\ xc2。谁能解释一下呢?

14 个答案:

答案 0 :(得分:202)

\ xa0实际上是Latin1(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

答案 1 :(得分:161)

Python unicodedata库中有许多有用的东西。其中之一是.normalize()函数。

尝试:

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

如果您没有获得之后的结果,请使用上述链接中列出的任何其他方法替换NFKD。

答案 2 :(得分:15)

尝试在行尾使用.strip() private AdRequest adRequest; adRequest = new AdRequest.Builder().build(); IMBanner bannerAdView = (IMBanner)mConvertView.findViewById(R.id.bannerView); AdView mAdView = (AdView) mConvertView.findViewById(R.id.adView); adRequest = new AdRequest.Builder().build(); AdUtils.getInstance().loadInMobiBanner(bannerAdView, new IAdListener() { @Override public void onFail() { mAdView.loadAd(adRequest); } }); 对我很有用

答案 3 :(得分:12)

我遇到了同样的问题,用python从sqlite3数据库中提取一些数据。以上答案对我不起作用(不确定原因),但这样做:line = line.decode('ascii', 'ignore')但是,我的目标是删除\ xa0s,而不是用空格替换它们。

我是从this super-helpful unicode tutorial by Ned Batchelder.

得到的

答案 4 :(得分:11)

试试这个:

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

答案 5 :(得分:8)

我在搜索不可打印字符的问题时最终到了这里。我使用MySQL UTF-8 general_ci并处理波兰语。对于有问题的字符串,我必须按如下方式进行:

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

这只是快速的解决方法,你可能应该尝试使用正确的编码设置。

答案 6 :(得分:7)

试试此代码

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

答案 7 :(得分:5)

尝试了几种方法后,总结一下,这就是我做的方法。以下是从解析的HTML字符串中避免/删除\ xa0字符的两种方法。

假设我们的原始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'

以上代码在字符串中生成 \ xa0 这些字符。要正确删除它们,我们可以使用两种方法。

方法#1(推荐): 第一个是BeautifulSoup的 get_text 方法, strip参数为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'

我还详细介绍了您可能想要引用的这些方法on this blog

答案 8 :(得分:4)

0xA0(Unicode)是UTF-8中的0xC2A0。 .encode('utf8')将只取你的Unicode 0xA0并替换为UTF-8的0xC2A0。因此,0xC2s的显示......编码并没有取代,正如你现在可能已经意识到的那样。

答案 9 :(得分:1)

在Beautiful Soup中,您可以传递get_text()条带参数,该参数从文本的开头和结尾处去除空白区域。如果它出现在字符串的开头或结尾,这将删除\xa0或任何其他空格。美丽的汤用\xa0替换了一个空字符串,这解决了我的问题。

mytext = soup.get_text(strip=True)

答案 10 :(得分:1)

带有正则表达式的通用版本(它将删除所有控制字符):

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

答案 11 :(得分:1)

你可以试试string.strip()
它对我有用! :)

答案 12 :(得分:0)

这等效于空格字符,因此将其删除

print(string.strip()) # no more xa0

答案 13 :(得分:-1)

Python会将其识别为空格字符,因此您可以split不带参数的情况下使用普通空格将其加入:

line = ' '.join(line.split())