带有 "xe2x80x93" "-" 字符的普通字符串

Normal string with "xe2x80x93" "-" char

我在 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"

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

你对 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')