Вопрос по python, html – Почему Python не отображает этот текст правильно? (Проблема декодирования UTF-8)

3
import urllib.request as u

zipcode = str(47401)
url = 'http://watchdog.net/us/?zip=' + zipcode
con = u.urlopen(url)

page = str(con.read())
value3 = int(page.find("<title>")) + 7
value4 = int(page.find("</title>")) - 15
district = str(page[value3:value4])
print(district)
newdistrict = district.replace("\xe2\x80\x99","'")
print(newdistrict)

По какой-то причине мой код вытягивает заголовок в следующем формате:IN-09: Indiana\xe2\x80\x99s 9th, Я знаю\xe строка символов является Unicode для' символ, но я не могу понять, как заставить Python заменить этот набор символов на' условное обозначение. Я пытался декодировать строку, но она уже в Юникоде, и приведенный выше код замены ничего не меняет. Любой совет относительно того, что я делаю неправильно?

Да, с использованием Python 3. Это странно, даже если я делаю district.find ("\ xe2 \ x80 \ x99"), значение, которое он назначает, равно -1, подразумевая, что он не находит эту строку символов в переменной района, даже если он печатает ее на экране при вызове функции печати. user1353035
Это не'это (U + 2019, ПРАВАЯ ОДНОКВАЖНАЯ КВАРТАЛА). Chris Morgan
Вы пытались использоватьunicode литералы? Ignacio Vazquez-Abrams
Видя, как вы используетеurllib.requestЯ полагаю, вы используете Python 3. Chris Morgan
Я не совсем уверен, что вы подразумеваете под этим, не могли бы вы предоставить немного больше информации? user1353035

Ваш Ответ

2   ответа
4

con.text(), это возвращаетbytes объект. призваниеstr() на нем возвращает строкуrepresentation из этого - таким образом, экранированные символы используются вместо реальных символов, если вы не указываете кодировку. (Это означает, что ваша строка содержит\\xe2\\x80\\x99 а также всякие другие нежелательные вещи.)bytes в основном какstr в Python 2: в нем не хранится информация о кодировании.str в Python 3 это какunicode в Python 2; у него есть кодировка. Итак, при поворотеbytes возражать вstr объект, вы должны сказать ему, в какой кодировке он находится на самом деле. В этом случае этоutf-8.

Вместо звонкаstr() на нем вы бы лучше использовалиbytes.decode; это то же самое, просто аккуратнее.

>>> import urllib.request as u
>>> zipcode = 47401
>>> url = 'http://watchdog.net/us/?zip={}'.format(zipcode)
>>> con = u.urlopen(url)
>>> page = con.read().decode('utf-8')
>>> page[page.find("<title>") + 7:page.find("</title>") - 15]
'IN-09: Indiana’s 9th'

Единственное функциональное изменение, которое было сделано здесь, - это спецификация для декодированияbytes объект как'utf-8'.

По сути, речь идет о том, чтоstr(b'\xab') производит"b'\\xab'" вместо'\xab' (это эквивалентно `repr (b '' \ xab '), поскольку нет никакого значимого преобразования без указания кодировки).
Спасибо за вашу помощь, я изначально пытался декодировать файл, используя что-то вроде: page = con.read () newpage = page.decode (& quot; utf-8 & apos;), который работал над предыдущими назначениями, но давал мне пустое место страница здесь. Затем я обнаружил, что, удалив строку декодирования, я смог получить ее для возврата исходного кода, поэтому я просто начал работать с этим. Не уверен, что происходит, еще раз спасибо за вашу помощь. :) user1353035
-1

newdistrict = district.encode("**THE_INPUT_STRING_ENCODING**").replace("\\xe2\\x80\\x99","'")

я думаю, что вы используете UTF-8, так что это должно выглядеть так

newdistrict = district.encode("utf-8").replace("\\xe2\\x80\\x99","'")

но это не правильно, зачем работать с юникодом. как только ваш текст будет импортирован в программу, вы должны работать везде в юникоде кроме, может быть, когда вы выводите в качестве вывода следует учитывать внешний пункт назначения

так что лучше добавить строку вверху вашего скрипта

# -*- coding: utf-8 -*-

читать введенные вами данные как utf-8

page = con.read().decode('utf-8')

а затем сделать     newdistrict = district.replace (u"YOUR_UNICODE_STRING", & Quot; & APOS; & Quot;)

например

newdistrict = district.replace(u"דכעדחלגעדיל","'")

для получения дополнительной помощи прочитайте это

http://docs.python.org/howto/unicode.html

Ваш ответ неверен, так как это Python 3, с которым он имеет дело.

Похожие вопросы