如何消除☎ unicode?
Posted
技术标签:
【中文标题】如何消除☎ unicode?【英文标题】:How to eliminate the ☎ unicode? 【发布时间】:2013-04-30 09:21:15 【问题描述】:在网页抓取期间并在删除所有 html 标签后,我得到了 unicode (☎) 中的黑色电话字符 \u260e。但与this response 不同,我也想摆脱它。
我在 Scrapy 中使用了以下正则表达式来消除 html 标签:
pattern = re.compile("<.*?>| |&",re.DOTALL|re.M)
然后我尝试匹配 \u260e,我想我被the backslash plague 抓住了。我尝试了这种模式,但没有成功:
pattern = re.compile("<.*?>| |&|\u260e",re.DOTALL|re.M)
pattern = re.compile("<.*?>| |&|\\u260e",re.DOTALL|re.M)
pattern = re.compile("<.*?>| |&|\\\\u260e",re.DOTALL|re.M)
这些都不起作用,我仍然有 \u260e 作为输出。 我怎样才能让它消失?
【问题讨论】:
如您的链接中所述,原始字符串是反斜杠瘟疫的解毒剂。这可能不是最相关的事情,但请记住。 根据@Rubens 的回答,您面临的问题是常规字符串不是 正确编码的,除非您在前面加上u
。跨度>
+1 因为这是我第一次在 URL 中看到☎
【参考方案1】:
使用 Python 2.7.3,以下对我来说很好:
import re
pattern = re.compile(u"<.*?>| |&|\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?的主要内容,如果未能解决你的问题,请参考以下文章