Нормальная строка с "xe2x80x93" "-" char - PullRequest
0 голосов
/ 07 октября 2018

У меня проблема со строками в python3 .моя переменная г является нормальной строкой.Но в этом есть раздражающая "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"

Как это может работать?Я не могу дальше.

1 Ответ

0 голосов
/ 07 октября 2018

У вас есть правильная идея с decode.

Оборачивая вывод в str(...) в эту строку:

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

Вы либо преобразуете байтовый объект встрока (это будет видно по ведущему b' и завершающему ' в content), или, если он уже был декодирован как 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')
...