Какой тип содержимого по умолчанию / кодировка? - PullRequest
6 голосов
/ 27 ноября 2009

Согласно этому ответу: urllib2 читается в Unicode

Мне нужно получить тип контента, чтобы перейти на юникод. Тем не менее, некоторые сайты не имеют "кодировки".

Например, ['content-type'] для этой страницы - "text / html". Я не могу преобразовать это в Unicode.

encoding=urlResponse.headers['content-type'].split('charset=')[-1]
htmlSource = unicode(htmlSource, encoding)
TypeError: 'int' object is not callable

Есть ли по умолчанию "кодировка" (конечно, на английском) ... так что, если ничего не найдено, я могу просто использовать это?

Ответы [ 5 ]

3 голосов
/ 27 ноября 2009

Ну, я только что просмотрел указанный URL, который перенаправляет на

http://www.engadget.com/2009/11/23/apple-hits-back-at-verizon-in-new-iphone-ads-video

затем нажмите Crtl-U (просмотреть исходный код) в FireFox, и он покажет

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

@ Конрад: что ты имеешь в виду "кажется, будто ... использует ISO-8859-1" ??

@ alex: с чего вы взяли, что у него нет "кодировки" ??

Посмотрите на код, который у вас есть (который, как нам кажется, является строкой, вызывающей ошибку (пожалуйста, всегда показывайте ПОЛНУЮ трассировку и сообщение об ошибке!)):

htmlSource = unicode(htmlSource, encoding)

и сообщение об ошибке:

TypeError: 'int' object is not callable

Это означает, что unicode не относится к встроенной функции, это относится к int. Я помню, что в вашем другом вопросе у вас было что-то вроде

if unicode == 1:

Я предлагаю вам использовать другое имя для этой переменной - скажем, use_unicode.

Дополнительные предложения: (1) всегда показывать достаточно кода, чтобы воспроизвести ошибку (2) всегда читать сообщение об ошибке.

3 голосов
/ 27 ноября 2009

Есть ли по умолчанию "кодировка" (на английском, конечно) ... так что, если ничего не найдено, я могу просто использовать это?

Нет, нет. Вы должны догадаться.

Тривиальный подход: попробуйте и расшифруйте как UTF-8. Если это работает, отлично, это, вероятно, UTF-8. Если этого не произойдет, выберите наиболее вероятную кодировку для типов просматриваемых страниц. Для английских страниц это cp1252, западноевропейская кодировка Windows. (Это похоже на ISO-8859-1; на самом деле большинство браузеров будут использовать cp1252 вместо iso-8859-1, даже если вы укажете эту кодировку, поэтому стоит повторить это поведение.)

Если вам нужно угадать другие языки, это становится очень волосатым. Существуют модули, которые помогут вам угадать в таких ситуациях. См. Например chardet .

2 голосов
/ 27 ноября 2009

Теоретически , кодировка по умолчанию: ISO-8859-1 . Но часто на это нельзя положиться. Веб-сайты, которые не отправляют явную кодировку, заслуживают выговора. Хотите отправить гневное письмо веб-мастеру Endgadget?

0 голосов
/ 27 ноября 2009

Если нет явного типа контента, это должен быть ISO-8859-1, как указано ранее в ответах. К сожалению, это не всегда так, поэтому разработчики браузеров потратили некоторое время на разработку алгоритмов, которые пытаются угадать тип контента на основе контента вашей страницы.

К счастью для вас, Марк Пилигрим проделал всю тяжелую работу по переносу реализации firefox на python в виде chardet module . Его введение о том, как это работает для одной из глав Dive Into Python 3, также стоит прочитать.

0 голосов
/ 27 ноября 2009

htmlSource=htmlSource.decode("utf8") должно работать в большинстве случаев, кроме случаев, когда вы сканируете сайты с неанглийским кодированием.

или вы можете написать функцию принудительного декодирования, как эта

def forcedecode(text):
    for x in ["utf8","sjis","cp1252","utf16"]:
        try:return text.decode(x)
        except:pass
    return "Unknown Encoding"
...