Я следовал твоим инструкциям. Отображаемая страница имеет код NOT в кодировке UTF-8; декодирование с использованием UTF-8 завершается неудачно. Согласно экспериментальному детектору наборов символов, с которым я иногда сталкиваюсь, он закодирован в латинской кодировке ... одной из ISO-8859-1, cp1252 и ISO-8859-15, и язык выглядит так: es '(испанский) или' fr '(французский). По моему мнению, это испанский. Firefox (View >>> view кодирование) говорит, что это ISO-8859-1.
Итак, теперь вам нужно поэкспериментировать с тем, какие инструменты будут правильно отображать ваши сохраненные файлы. Если вы не можете его найти, вам нужно будет перекодировать ваши файлы в UTF-8, то есть data.decode ('ISO-8859-1'). Encode ('UTF-8') и найти инструмент, отображающий UTF-8. правильно. Не должно быть слишком сложно. Firefox может вывести кодировку и отобразить ее корректно практически для любой кодировки, которую я выбрасывал.
Обновление после запроса на «интуицию»:
В вашем третьем блоке кода вы включаете только вход и выход, с "..." между ними. Входной код должен выдавать unicode
объектов ОК. Однако в выходном коде вы используете функцию str
(почему ???). Предполагая, что у вас все еще есть unicode
объекты после "...", применение str()
к ним вызовет исключение, если кодировка вашей системы по умолчанию 'ascii' (как и должно быть), или незаметно искажает ваши данные, если 'utf8' (как и не должно быть). Пожалуйста, опубликуйте (1) содержимое «...» (2) результат выполнения import sys; print sys.getdefaultencoding()
(3) того, что вы «видите» в выходном файле вместо ожидаемого - в «Iglesia Católica» - так ли это ó
? (4) фактические байты в файле (используйте print repr (данные)) вместо ожидаемых -
решено Вы говорите в комментарии, что видите Iglesia Cat√ɬ≥lica
... обратите внимание, что вместо одного ожидаемого отображается четыре символа. Это симптоматично дважды кодировать в UTF-8. Следующей загадкой было то, что отображало те символы, два из которых не отображены ни в ISO-8859-1, ни в cp1252. Я попробовал старые кодовые страницы DOS cp437 и cp850, все еще используемые в окне командной строки Windows, но они не подходили. кои8р тоже не подходил; это нуждается в основанном на латинице наборе символов. Хм как насчет макромана? Тада !! Вы отправили дважды закодированный гфф на стандартный вывод на вашем терминале Mac. См. Демонстрацию ниже.
>>> from unicodedata import name
>>> oacute = u"\xf3"
>>> print name(oacute)
LATIN SMALL LETTER O WITH ACUTE
>>> guff = oacute.encode('utf8').decode('latin1').encode('utf8')
>>> guff
'\xc3\x83\xc2\xb3'
>>> for c in guff.decode('macroman'):
... print name(c)
...
SQUARE ROOT
LATIN CAPITAL LETTER E WITH ACUTE
NOT SIGN
GREATER-THAN OR EQUAL TO
>>>
Проверка сохраненного файла Я также сохранил веб-страницу в файл (плюс каталог, содержащий * .jpg, файл CSS и т. Д.) - используя Firefox «сохранить страницу как». Попробуйте сделать это на сохраненной странице и опубликуйте результаты.
>>> data = open('g0.htm', 'rb').read()
>>> uc = data.decode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb7 in position 1130: invalid start byte
>>> pos = data.find("Iglesia Cat")
>>> data[pos:pos+20]
'Iglesia Cat\xf3lica</a>'
>>> # Looks like one of ISO-8859-1 and its cousins to me.
Обратите внимание: если ваш файл закодирован в UTF-8, то чтение его с кодеком UTF-8 приведет к Unicode. Если вы не обрабатываете данные каким-либо образом при синтаксическом анализе и пишете проанализированный юникод с помощью кодека UTF-8, он НЕ будет кодироваться дважды. Вам нужно внимательно посмотреть в своем коде на наличие экземпляров «str» (помните «typo»?), «Unicode», «encode», «decode», «utf», «UTF» и т. Д. Вы называете третий -партийная библиотека для разбора? Что вы видите, когда делаете print repr(key), repr(field[key])
непосредственно перед записью в выходной файл?
Это становится утомительным. Подумайте о том, чтобы разместить свой код и сохраненную страницу в Интернете где-нибудь, чтобы мы могли посмотреть на нее, а не гадать.
32766.html: Я только что понял, что вы тот парень, который уничтожил все свои inode, пытаясь записать слишком много файлов в папку в файловой системе vfat (или что-то в этом роде). Таким образом, вы не делаете руководство "сохранить как". Пожалуйста, опубликуйте код, который вы использовали для «сохранения» этих файлов.