Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Unicode&;双反斜杠_Python_Unicode_Beautifulsoup_Backslash_Unicode Escapes - Fatal编程技术网

Python-Unicode&;双反斜杠

Python-Unicode&;双反斜杠,python,unicode,beautifulsoup,backslash,unicode-escapes,Python,Unicode,Beautifulsoup,Backslash,Unicode Escapes,我用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 我

我用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

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

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

由于您在那里使用的是Python2,因此只需重新应用“decode”方法,即使用特殊的编解码器“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
对象-必须首先将这些对象重新编码为字节字符串对象,然后使用
解码转义
编解码器进行解码。出于这些目的,可以使用
latin1
编解码器作为
透明编码:str对象中的所有字节都保留在新字节对象中:

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

我第一次在我的整个列表中尝试了你的解决方案,但没有成功。然后,我将您的4行代码复制到一个脚本中,并尝试运行它,但它抛出了以下错误:
unicodeincodeerror:“charmap”编解码器无法对位置4中的字符u'\u2019'进行编码:字符映射到
您应该包含完整的示例,以便更好地理解您的问题。发生这个新错误是因为列表中的字符串没有双反斜杠,所以它们已经被解码了。您必须先删除好的字符串,或者使用
try:except
函数当您试图在无法正确映射此字符的终端中打印解码字符串时,这很可能是一个问题。检查发生错误的行的错误消息。这个答案是正确的。如果您在windows上,您将无法在CMD终端上看到正确的输出,因为它使用的编码只有256个字符,不包括“\u2019”字符。尝试将结果保存到utf-8编码的文件中,并改为在编辑器中打开该文件。@mgruber您只需将其编码到
utf-8
。检查AttributeError:'str'对象没有属性'decode',您使用的是Python3,OP和本例都在Python2中。(在python 2中,首先,带前缀的字符串是unicode对象,而不是str)。请注意,投票系统不是针对个人供应商的——它是用来标记错误答案的。我在问题中没有看到任何关于Python版本的参考,这只是因为您不习惯Python的不同版本。除其他线索外,还有“print”语句而不是函数。@mgruber请记住,如果答案对您有帮助,请接受它。除非网页确实包含类似的unicode转义序列(即\u2019s而不是那样),否则beautifulsoup将不会以该形式返回字符串。它将返回文本而不转义任何内容。你是如何得到这些字符串的?我在同一时间执行了一个正则表达式,似乎这就是问题所在。你对此有什么特别的解释吗?你有没有删去JSON结构的子部分?如果是这样的话,你应该试着读取整个JSON值,使用
JSON.loads
解析它,然后从那里访问你想要的部分。我确实是通过首先使用
data=JSON.loads(name_of_file)
加载它来访问它们的,然后我只使用
raw=data['html'获得了我想要的东西
。我假设下一步我试图用
raw=re sub(“(?s)”,,str(raw))
清除注释(在某些情况下使用BeautifulSoup后仍然会留下一些注释)
导致输出混乱。