如何消除☎ unicode?

Posted

技术标签:

【中文标题】如何消除☎ unicode?【英文标题】:How to eliminate the ☎ unicode? 【发布时间】:2013-04-30 09:21:15 【问题描述】:

在网页抓取期间并在删除所有 html 标签后,我得到了 unicode (☎) 中的黑色电话字符 \u260e。但与this response 不同,我也想摆脱它。

我在 Scrapy 中使用了以下正则表达式来消除 html 标签:

pattern = re.compile("<.*?>|&nbsp;|&amp;",re.DOTALL|re.M)

然后我尝试匹配 \u260e,我想我被the backslash plague 抓住了。我尝试了这种模式,但没有成功:

pattern = re.compile("<.*?>|&nbsp;|&amp;|\u260e",re.DOTALL|re.M)
pattern = re.compile("<.*?>|&nbsp;|&amp;|\\u260e",re.DOTALL|re.M)
pattern = re.compile("<.*?>|&nbsp;|&amp;|\\\\u260e",re.DOTALL|re.M)

这些都不起作用,我仍然有 \u260e 作为输出。 我怎样才能让它消失?

【问题讨论】:

如您的链接中所述,原始字符串是反斜杠瘟疫的解毒剂。这可能不是最相关的事情,但请记住。 根据@Rubens 的回答,您面临的问题是常规字符串不是 正确编码的,除非您在前面加上u。跨度> +1 因为这是我第一次在 URL 中看到☎ 【参考方案1】:

使用 Python 2.7.3,以下对我来说很好:

import re

pattern = re.compile(u"<.*?>|&nbsp;|&amp;|\u260e",re.DOTALL|re.M)
s = u"bla ble \u260e blo"
re.sub(pattern, "", s)

输出:

u'bla ble  blo'

正如@Zack 所指出的,这是因为字符串现在是 unicode,即字符串已经被转换,字符序列\u260e 现在是 -- 可能 -- 使用的两个字节写那个黑色的小手机☎(:

一旦要搜索的字符串和正则表达式都有黑色电话本身,而不是字符序列\u260e,它们都匹配。

【讨论】:

很好的答案,但您或许应该强调,这里的关键区别在于所有字符串上的 u 前缀,即在 Unicode 而不是字节字符串上操作。 我猜 u 前缀有所不同。成功了,谢谢。【参考方案2】:

如果您的字符串已经是 unicode,有两种简单的方法。显然,第二个影响不仅仅是☎。

>>> import string                                   
>>> foo = u"Lorum ☎ Ipsum"                          
>>> foo.replace(u'☎', '')                           
u'Lorum  Ipsum'                                     
>>> "".join(s for s in foo if s in string.printable)
u'Lorum  Ipsum'      
Remove non-ascii characters but leave periods and spaces 了解更多关于 string.printable 的信息 The SHORTEST way to remove multiple spaces in a string in Python 如果您不想要多个空格。

【讨论】:

直接在终端上写那个 ☎ 字符就可以了,但在我的管道上却不行。用 \u260e 替换它效果更好。感谢您提供这 2 个额外的提示 :)【参考方案3】:

您可以尝试使用 BeatifulSoup,如 here 所述,使用类似

soup = BeautifulSoup (html.decode('utf-8', 'ignore'))

【讨论】:

以上是关于如何消除☎ unicode?的主要内容,如果未能解决你的问题,请参考以下文章

python unicode渲染:如何知道字体中是不是缺少unicode字符

用java如何把unicode码转成汉字?

如何判断一个字符串是不是是unicode编码?

java中如何获得一个字符的unicode编码

python中如何打印或保存unicode编码内容成中文?

如何将unicode转换成汉字