【问题标题】:Normal string with "xe2x80x93" "-" char带有“xe2x80x93”“-”字符的普通字符串
【发布时间】:2019-03-12 01:17:10
【问题描述】:

python3 中的字符串有问题。我的 var g 是一个普通的字符串。但其中有一个烦人的“xe2x80x93”,因为它来自一个网络解析器。我想将其转换为合适的字符 "-"

content = str(urllib.request.urlopen(site, timeout=10).read())
g = content.split('<h1 itemprop="name"')[1].split('</span></h1>')[0].split('<span>')[1].replace("\\", "")

print(type(g)) --> string
print(g)  --> "Flash xe2x80x93 der rote Blitz"

print(g.encode('latin-1').decode('utf-8')) --> AttributeError: 'str' object has no attribute 'decode'
print(repr(g.decode('unicode-escape'))) --> AttributeError: 'str' object has no attribute 'decode'
print(g.encode('ascii','replace')) --> b'Flash xe2x80x93 der rote Blitz'
print(bytes(g, "utf-8").decode()) --> "Flash xe2x80x93 der rote Blitz"
print(bytes(g, "utf-8").decode("unicode_escape")) --> "Flash â der rote Blitz"

它是如何工作的?我没有更进一步。

【问题讨论】:

  • print(type(urllib.request.urlopen(site, timeout=10).read())) 说什么?
  • ,所以我必须使用 ".decode("utf-8") ",而不是 str() ?
  • 谢谢!我已经更新了我的答案,给你一个应该适合你的替代第一行。
  • 卢卡斯,是的——试试吧,让我/我们知道它是怎么回事:)
  • 是的,它有效! @jedwards。非常感谢!

标签: python python-3.x string unicode-escapes


【解决方案1】:

decode 的想法是对的。

通过在此行中将输出包装在str(...) 中:

content = str(urllib.request.urlopen(site, timeout=10).read())

您要么将字节对象转换为字符串(这将通过 content 中的前导 b' 和尾随 ' 显而易见),或者,如果它已经被解码为 ISO-8859-1 ,什么都不做。

在任何一种情况下,都不要这样做 - 删除包装 str 调用。

现在,内容将是 bytes 对象或 str 对象。

因此,如果它是一个字符串,它就会被(错误地)解码为 ISO-8859-1。您需要将其编码回字节对象,然后正确解码:

content = urllib.request.urlopen(site, timeout=10).read()

if isinstance(content, str):
    content = content.encode('iso-8859-1')
content = content.decode('utf8')

现在,您的 \xe2\x80\x93 字节应该正确显示为:–

更新

根据您的评论,您需要做的就是:

content = urllib.request.urlopen(site, timeout=10).read().decode('utf8')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 2014-04-22
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2017-11-30
    相关资源
    最近更新 更多