316

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

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

编辑:问题似乎已解决str.replace(u'\xa0', ' ').encode('utf-8'),但只是.encode('utf-8')不这样做replace()似乎会导致它吐出更奇怪的字符,例如 \xc2 。谁能解释一下?

4

14 回答 14

367

\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

请注意:这个答案从 2012 年开始,Python 已经继续,你现在应该可以使用unicodedata.normalize

于 2012-07-19T17:42:44.883 回答
285

unicodedataPython 的库中有很多有用的东西。其中之一是.normalize()功能。

尝试:

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

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

于 2016-01-08T04:24:55.070 回答
27

尝试了几种方法,总结一下,我就是这样做的。以下是从解析的 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'

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

于 2018-01-16T16:57:40.633 回答
26

尝试在行尾使用 .strip() line.strip()对我来说效果很好

于 2015-07-21T21:50:36.607 回答
19

尝试这个:

string.replace('\\xa0', ' ')
于 2012-06-12T09:20:32.923 回答
13

我遇到了同样的问题,使用 python 从 sqlite3 数据库中提取一些数据。上面的答案对我不起作用(不知道为什么),但确实如此:line = line.decode('ascii', 'ignore')但是,我的目标是删除 \xa0s,而不是用空格替换它们。

我从Ned Batchelder 的这个超级有用的 unicode 教程中得到了这个。

于 2012-12-11T20:39:35.243 回答
9

试试这个代码

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
于 2017-03-20T13:04:08.803 回答
9

Python 将其识别为空格字符,因此您可以split不使用 args 并通过普通空格连接:

line = ' '.join(line.split())
于 2019-04-23T07:16:38.760 回答
8

我在谷歌搜索无法打印字符的问题时来到这里。我使用 MySQLUTF-8 general_ci并处理波兰语。对于有问题的字符串,我必须按以下方式处理:

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

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

于 2014-02-22T12:09:07.290 回答
4

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

于 2012-06-12T12:02:29.257 回答
4

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

mytext = soup.get_text(strip=True)
于 2015-01-19T14:51:48.697 回答
4

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

print(string.strip()) # no more xa0
于 2019-03-06T17:23:47.420 回答
1

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

import re
def remove_control_chart(s):
    return re.sub(r'\\x..', '', s)
于 2018-07-02T12:28:45.570 回答
0

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

于 2021-01-30T14:13:44.253 回答