如何删除\xa0从字符串在Python?

我目前正在使用Beautiful Soup来解析HTML文件并调用get_text(),但似乎我留下了很多\xa0 Unicode表示空间。在python2.7中是否有一种有效的方法将它们全部删除,并将它们更改为空格?我想更普遍的问题应该是,有没有办法移除Unicode格式?

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

编辑:这个问题似乎通过str.replace(u'\xa0', ' ').encode('utf-8')解决了,但是只使用.encode('utf-8')而不使用replace()似乎会导致它吐出更奇怪的字符,例如\xc2。有人能解释一下吗?

413524 次浏览

试试这个:

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

0xA0 (Unicode)在UTF-8中是0xC2A0。.encode('utf8')只会把你的Unicode 0xA0替换为UTF-8的0xC2A0。因此出现了0xc2…编码不是替代,正如您现在可能已经意识到的那样。

\xa0在拉丁语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从sqlite3数据库中提取一些数据时遇到了同样的问题。上面的答案对我不起作用(不确定为什么),但这个起作用了:line = line.decode('ascii', 'ignore')然而,我的目标是删除\xa0,而不是用空格替换它们。

我从这是Ned Batchelder编写的超级有用的unicode教程。得到这个

我在这里结束,而谷歌的问题与不可打印的字符。我使用MySQL UTF-8 general_ci和处理波兰语言。对于有问题的字符串,我必须进行如下处理:

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

这只是一个快速的解决方案,你可能应该尝试一些正确的编码设置。

在Beautiful Soup中,你可以将strip参数传递给get_text(),该参数将删除文本开头和结尾的空白。这将删除\xa0或任何其他空白,如果它出现在字符串的开头或结尾。Beautiful Soup用\xa0替换了空字符串,这为我解决了问题。

mytext = soup.get_text(strip=True)

试着在你的行末尾使用.strip() line.strip()对我来说工作得很好

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

试一试:

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

如果你没有得到你想要的结果,用上面链接中列出的任何其他方法替换NFKD。

试试这段代码

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

在尝试了几种方法之后,总结一下,我是这样做的。下面是两种避免/从解析的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方法,包含条形参数为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

方法二: 另一个选项是使用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'

我还详细介绍了这些方法在这个博客上,你可能想要参考。

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

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

它相当于一个空格字符,所以去掉它

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

Python像识别空格字符一样识别它,所以你可以在不带参数的情况下split它,并通过正常的空格来连接:

line = ' '.join(line.split())
你可以尝试string.strip()
这对我很管用!:) < / p >

这就是我如何解决这个问题,因为我遇到了\xao在html编码字符串。

我发现插入了一个打破None的空格,以确保一个单词和后续的HTML标记不会由于页面大小的调整而分开。

< p >这 为解析代码提供了一个问题,因为它引入了编解码器编码问题。难办的是我们 不知道所使用的编码。从Windows机器可以是latin-1或CP1252(西方ISO), 但最近的操作系统已经标准化为UTF-8。通过规范化unicode数据,我们去掉\xa0

my_string = unicodedata.normalize('NFKD', my_string).encode('ASCII', 'ignore')