如何消除☎ Unicode?

9

在进行网络爬虫并且去除所有HTML标签后,我得到了Unicode编码的黑色电话字符\u260e(☎)。但与这个回答不同,我也想把它去掉。

我在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作为输出结果。如何使其消失?


如你链接中所提到的,原始字符串是反斜杠困扰的解药。这可能并不是此处最相关的事情,但请记住它。 - Mike
与@Rubens的答案一致,您面临的问题是常规字符串没有正确的Unicode编码,除非您在前面加上“u”。 - jpaugh
+1 因为这是我第一次在 URL 中看到 ☎。 - user764357
3个回答

7

使用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,它们都会匹配。


7
回答不错,但你或许应该强调一下这里的关键区别在于所有字符串都有 u 前缀,也就是操作的是 Unicode 而不是字节串。 - zwol
我猜测那个 u 前缀起了一些作用。它有效了,谢谢。 - rafa

4

直接在终端上写入那个☎字符是可以的,但在我的管道中却不行。用\u260e替换它效果更好。感谢您提供的这两个额外提示 :) - rafa

1

你可以尝试使用BeautifulSoup,就像这里所解释的那样,类似如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接