【问题标题】:Python - Unicode & double backslashesPython - Unicode 和双反斜杠
【发布时间】:2017-05-18 22:05:59
【问题描述】:

我用 BeautifulSoup 废弃了一个网页。 我得到了很好的输出,除了部分列表在获取文本后看起来像这样:

list = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013']

我现在的问题是如何去除或用特殊字符替换这些双反斜杠。

如果我打印示例列表的第一个元素,输出看起来像

print list[0]
that\u2019s

我已经阅读了很多关于这个主题的其他问题/主题,但我最终更加困惑,因为我是一个考虑 unicode/编码/解码的初学者。

我希望有人可以帮助我解决这个问题。

谢谢! MG

【问题讨论】:

  • @mgruber 如果对你有帮助,记得接受答案
  • 除非网页字面上包含这样的 unicode 转义序列(that\u2019s 而不是 that's),beautifulsoup 不会以这种形式返回字符串.它将返回文本而不转义任何内容。你是怎么得到这些字符串的?
  • 我同时执行了一个正则表达式,似乎这就是问题所在。你对此有什么特别的解释吗?
  • 你抓取过 JSON 结构的子部分吗?如果是这样,您应该尝试读取整个 JSON 值,使用 json.loads 解析它并从那里访问您想要的部分。
  • 我确实通过首先用data = json.load(name_of_file) 加载它来访问它们,然后我只用raw = data['html'] 得到了我想要的东西。我假设下一步我试图摆脱 cmets(仍然在某些情况下使用 BeautifulSoup 后留下了一些)raw = re-sub('(?s)<!--.*?-->', '',str(raw)) 让我的输出变得混乱。

标签: python unicode beautifulsoup backslash unicode-escapes


【解决方案1】:

这里的问题是网站最终对这些 un​​icode 参数进行了双重编码,只需执行以下操作:

ls = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013']

ls = map(lambda x: x.decode('unicode-escape'), ls)

现在您有了一个包含正确 unicode 编码字符串的列表:

for a in ls:
   print a

【讨论】:

  • 我首先在整个列表中尝试了您的解决方案,但没有成功。然后我将你的 4 行代码复制到一个脚本中并尝试运行它,它抛出了以下错误:UnicodeEncodeError: 'charmap' codec can't encode character u'\u2019' in position 4: character maps to <undefined>
  • 您应该包含完整的示例,以便更好地理解您的问题。这个新错误正在发生,因为您的列表中有没有双反斜杠的字符串,因此它们已经被解码。你必须先删除好的,或者使用try:except函数
  • 当您尝试在无法正确映射此字符的终端中打印解码字符串时,这更可能是一个问题。检查发生错误的行的错误消息。这个答案是正确的。
  • 如果您在 Windows 上,您将无法在 CMD 终端上看到正确的输出 - 因为它使用的编码只有 256 个字符,不包括“\u2019”字符。尝试将结果保存到 utf-8 编码文件,然后在编辑器中打开。
  • @mgruber 您只需将其编码为utf-8。检查this answer
【解决方案2】:

由于您在那里使用的是 Python 2,因此只需重新应用“解码”方法 - 使用特殊的编解码器“unicode_escape”。它“看到”“物理”反冲并解码这些序列正确的 unicode 字符:

data =  [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013']

result = [part.decode('unicode_escape') for part in data]

致使用 Python3 的任何人:在该版本中,无法将“解码”方法应用于 beautifulsoup 提供的 str 对象 - 必须首先将这些对象重新编码为字节字符串对象,然后使用uncode_escape 编解码器。出于这些目的,使用latin1 编解码器作为transparent 编码很有用:str 对象中的所有字节都保留在新的字节对象中:

result = [part.encode('latin1').decode('unicode_escape') for part in data]

【讨论】:

  • AttributeError: 'str' 对象没有属性 'decode'
  • 您使用的是 Python 3,并且 OP 和这个示例都在 Python2 中。 (在 python 2 中,首先,u" " 前缀字符串是 unicode 对象,而不是 str)。拜托,投票系统不是为了个人仇杀 - 它是为了标记错误的答案。
  • 我在问题中没有看到 Python 版本的任何参考
  • 那只是因为你不习惯 Python 的不同版本。除了其他线索之外,还有“打印”语句而不是函数。
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2013-06-24
  • 2012-02-10
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多