Проблема в том, что строка уже декодирована. Обычно вы 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
. Я надеюсь, что это помогает. Пожалуйста, дайте мне знать, если я допустил ошибки, чтобы я мог внести необходимые исправления.