Объект String не имеет атрибута 'decode' при преобразовании UTF-8 - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь преобразовать G\xc3\xb6del в Gödel (в частности, \xc3\xb6d в ö), но я не могу найти способ сделать это. Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке:

>>> string = '\xc3\xb6'
>>> string.decode(encoding='UTF-8') 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

Этот вопрос , похоже, не помог, как и другие, которые казались похожими, поскольку все они были из 2.x. Друг упомянул кодировку base 64, но я не уверен, как это помогает. Кажется, я не могу найти, что мне нужно сделать, чтобы преобразовать его в 3.8, так как лучше всего сделать это go?

1 Ответ

0 голосов
/ 06 мая 2020

Проблема в том, что строка уже декодирована. Обычно вы encode строковый объект для байтового объекта, а обратная операция - это decoding байтовый объект для строкового объекта. Вот почему у строки нет атрибута decode. Думайте об этом так:

String -> encode -> Byte
Byte -> decode -> String

В этом случае решением было бы вызвать метод кодирования и передать 'utf8' или 'ascii', в зависимости от контекста и ситуации.

Однако, это не просто преобразование в строковый объект, как здесь. Как ответственный за этот вопрос, я точно знаю, для чего это было предназначено и как я пришел к решению. Значение Gödel было получено путем очистки страницы SCP Foundation, нахождения класса объекта, который затем передается моему боту Discord для выполнения команды. Вот мой код:

link = f"http://www.scp-wiki.net/scp-{num}"
page = get(link)

obj_class = [str(i) for i in page.iter_lines() if b"Object Class:" in i][0]
# ^ There should only be one line in the document matching that requirement.
# The type of this line is a byte object, which is why conversion is necessary later on.
obj_class = re.findall('(?<=\<\/strong> )(.*?)(?=\<)', obj_class)[0]
# ^ Find the actual class in that line.
print(obj_class)  # expected Gödel, got G\xc3\xb6del instead.

Вышеупомянутое не вызовет исключения, оно просто не преобразует кодировку символов, как требуется. Мое решение было простым, как только я понял, что происходит; замените str(i) на i.decode('utf8').

obj_class = [i.decode('utf8') for i in page.iter_lines() if b"Object Class:" in i][0]
# ^ decoding it there really makes the difference, converting it to utf-8 without dealing with
# the issues of decoded strings later on.

Теперь это вернет желаемое значение Gödel, а не G\xc3\xb6del. Я надеюсь, что это помогает. Пожалуйста, дайте мне знать, если я допустил ошибки, чтобы я мог внести необходимые исправления.

...