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

zhu*_*yxn 204 python unicode parsing

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

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

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

sam*_*ize 234

\ 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.

  • 我不知道有关Unicode和字符编码的大量内容..但似乎[unicodedata.normalize](http://docs.python.org/2/library/unicodedata.html#unicodedata.normalize)会更多适合比str.replace (9认同)
  • 当我尝试这个时,我得到`UnicodeDecodeError:'ascii'编解码器无法解码位置397中的字节0xa0:序数不在范围(128)中. (3认同)
  • [U+00a0 是一个不可破解的空格 Unicode 字符](http://codepoints.net/U+00a0) 在 latin1 编码中可以编码为 `b'\xa0'` 字节,作为两个字节 `b'\ xc2\xa0'` utf-8 编码。它可以在 html 中表示为 ` `。 (2认同)

小智 182

Python的unicodedata库中有许多有用的东西.其中之一就是.normalize()功能.

尝试:

new_str = unicodedata.normalize("NFKD", unicode_str)
Run Code Online (Sandbox Code Playgroud)

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

  • 这很棒.这应该是公认的答案. (8认同)
  • 此解决方案将俄语字母“й”更改为两个 Unicode 字符的外观相同的序列。这里的问题是曾经相等的字符串不再匹配。修复:使用“NFKC”而不是“NFKD”。 (3认同)
  • 这太棒了。它将单字母字符串“﷼”更改为实际的四字母字符串“מ”。因此,在需要时更换起来要容易得多。您可以正常化然后更换,而不必关心它是哪一个。`normalize("NFKD", "﷼").replace("?????", '')`。 (3认同)
  • 完全同意.简单,清晰,简洁,重点突出.竖起大拇指. (2认同)
  • 不太确定,您可能希望`normalize('NFKD','1º\ xa0dia')`返回'1ºdia',但返回'1o dia' (2认同)
  • 这里是[关于`unicodedata.normalize`的文档](https://docs.python.org/3/library/unicodedata.html#unicodedata.normalize) (2认同)
  • 啊,如果文本是“韩语”,请不要尝试这个。请注意。 (2认同)

use*_*113 17

尝试在你的行结束时使用.strip() line.strip()对我来说效果很好


use*_*064 12

试试这个:

string.replace('\\xa0', ' ')
Run Code Online (Sandbox Code Playgroud)

  • @RyanMartin:这取代了**四个字节**:`len(b'\\ xa0')== 4`但是`len(b'\ xa0')== 1`.如果可能的话; 你应该修复生成这些转义的上游. (5认同)
  • 这个解决方案对我有用:`string.replace('\xa0', ' ')` (2认同)

小智 12

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

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

  • 您现在正在删除任何非ASCII字符,您可能正在掩盖您的实际问题.即使您不了解离合器的工作原理,使用"忽略"就像是在推杆上推.. (13认同)
  • 对于某些目的,例如处理电子邮件或 URL,使用 .decode('ascii', 'ignore')` 似乎是完美的 (2认同)
  • [samwize 的答案](http://stackoverflow.com/a/11566398/4279) 不适合你,因为它适用于 **Unicode** 字符串。你的答案中的 `line.decode()` 表明你的输入是一个 **bytestring** (你不应该在 Unicode 字符串上调用 `.decode()` (为了强制执行它,该方法在 Python 3 中被删除)。我不明白怎么可能看到[您在答案中链接的教程](http://nedbatchelder.com/text/unipain.html) 并错过字节和 Unicode 之间的区别(不要混合他们)。 (2认同)

and*_*abs 8

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

text=text.replace('\xc2\xa0', ' ')
Run Code Online (Sandbox Code Playgroud)

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

  • 如果“text”是表示使用 utf-8 编码的文本的字节串,则此方法有效。如果您正在处理文本;首先将其解码为 Unicode (`.decode('utf-8')`),然后仅在最后将其编码为字节串(如果 API 不直接支持 Unicode,例如,`socket`)。对文本的所有中间操作都应在 Unicode 上执行。 (2认同)

shi*_*iva 8

试试这个代码

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


小智 7

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

mytext = soup.get_text(strip=True)
Run Code Online (Sandbox Code Playgroud)

  • 仅当“ ”位于每个文本位的开头或结尾时,“strip=True”才有效。如果文本中其他字符之间有空格,它不会删除该空格。 (11认同)

Jon*_*bop 7

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

line = ' '.join(line.split())
Run Code Online (Sandbox Code Playgroud)


Ali*_*ani 6

在尝试了几种方法之后,总结一下,这就是我的方法。以下是避免/从解析的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>'
Run Code Online (Sandbox Code Playgroud)

因此,让我们尝试清除此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'
Run Code Online (Sandbox Code Playgroud)

上面的代码在字符串中生成这些字符\ 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
Run Code Online (Sandbox Code Playgroud)

方法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'
Run Code Online (Sandbox Code Playgroud)

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

  • get_text(strip=True) 确实起到了作用。谢谢m8 (4认同)

8bi*_*kie 5

It's the equivalent of a space character, so strip it

print(string.strip()) # no more xa0
Run Code Online (Sandbox Code Playgroud)

  • 仅当它位于字符串的开头或结尾时,才会将其删除。 (6认同)