从 Python 中的字符串中删除转义实体 [重复]

Posted

技术标签:

【中文标题】从 Python 中的字符串中删除转义实体 [重复]【英文标题】:Removing escaped entities from a String in Python [duplicate] 【发布时间】:2013-08-11 09:04:09 【问题描述】:

我有一个巨大的 csv 推文文件。我将它们都读入计算机并将它们存储在两个单独的字典中 - 一个用于负面推文,一个用于正面推文。我想读取文件并将其解析为字典,同时删除任何标点符号。我用过这段代码:

tweets = []
for (text, sentiment) in pos_tweets.items() + neg_tweets.items():
    shortenedText = [e.lower() and e.translate(string.maketrans("",""), string.punctuation) for e in text.split() if len(e) >= 3 and not e.startswith('http')]
print shortenedText

除了一个小问题,一切都很好。不幸的是,我下载的巨大 csv 文件更改了一些标点符号。我不确定这叫什么,所以不能真正用谷歌搜索它,但实际上可能会开始一些句子

"ampampFightin"
""The truth is out there"
"&altThis is the way I feel"

有没有办法摆脱所有这些?我注意到后两个以&符号开头 - 将一个简单的搜索摆脱它(我问而不做的唯一原因是因为有太多推文让我手动检查)

【问题讨论】:

" 是一个 html 转义实体。您正在寻求摆脱这些。 任何缺少&; 字符的内容都是错误的,并且不可能恢复。 htmlhelp.com/reference/html40/entities/special.html 这是 HTML 4.0 中所有这些的列表。 【参考方案1】:

首先,取消转义HTML entities,然后删除标点字符:

import HTMLParser

tweets = []
for (text, sentiment) in pos_tweets.items() + neg_tweets.items():
    text = HTMLParser.HTMLParser().unescape(text)
    shortenedText = [e.lower() and e.translate(string.maketrans("",""), string.punctuation) for e in text.split() if len(e) >= 3 and not e.startswith('http')]
print shortenedText

这是一个示例,unescape 的工作原理:

>>> import HTMLParser
>>> HTMLParser.HTMLParser().unescape(""The truth is out there")
u'"The truth is out there'

更新: UnicodeDecodeError 问题的解决方案:使用 text.decode('utf8')。 Here 很好地解释了为什么需要这样做。

【讨论】:

要取消转义,我应该搜索以 & 符号开头的任何内容吗? 不,只要给它一个文本,它就会取消在文本中找到的实体。 谢谢你,但是当我运行它时,我得到了这个错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 28: ordinal not in range(128) import html.parser; html.parser.HTMLParser().unescape(text) 用于 Python 3。 @Andrew:您可以使用 str.encode() 将字符串强制转换为特定编码 - 在您的情况下可能是 text.encode('us-ascii') ?

以上是关于从 Python 中的字符串中删除转义实体 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 3.1 中对字符串中的 HTML 实体进行转义? [复制]

Python中的HTML转义[重复]

从实体框架中删除重复的 Context.vb 文件

HTML实体代码到文本[重复]

从C#目录中删除转义序列

Python编程题35--删除字符串中的所有相邻重复项