(замечание общего порядка - другие ответы касаются деталей)
нет никакой причины, что необходимо потерять мобильность при помощи их.
у Вас всегда есть опция создания простого нулевого эффекта, "встроенного" или макро-, который позволит Вам компилировать на других платформах с другими компиляторами.
Вы просто не извлечете пользу из оптимизации, если Вы будете на других платформах.
Есть ли "кодировка" по умолчанию (конечно, английский) ... чтобы я мог просто использовать ее, если ничего не найдено?
Нет, нет. Вы должны догадаться.
Тривиальный подход: попробуйте декодировать как UTF-8
. Если работает - отлично, вероятно, это UTF-8. Если это не так, выберите наиболее вероятную кодировку для типов просматриваемых страниц. Для страниц на английском языке это cp1252
, западноевропейская кодировка Windows. (Это похоже на ISO-8859-1; на самом деле большинство браузеров будут использовать cp1252
вместо iso-8859-1
, даже если вы укажете эту кодировку, поэтому стоит продублировать это поведение. )
Если вам нужно угадывать другие языки, это становится очень сложно. Существуют модули, которые помогут вам угадать в таких ситуациях. См. Например. chardet .
Ну, я только что просмотрел данный 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" />
@Konrad: что вы имеете в виду "кажется как будто ... использует ISO-8859-1 "??
@alex: почему вы думаете, что у него нет" кодировки "??
Посмотрите на код, который у вас есть (который, как мы УГАДАЕМ, является строка, вызывающая ошибку (всегда показывайте ПОЛНУЮ трассировку и сообщение об ошибке!)):
htmlSource = unicode(htmlSource, encoding)
и сообщение об ошибке:
TypeError: 'int' object is not callable
Это означает, что unicode
не относится к встроенной функции, он ссылается на int
. Напомню, что в другом вашем вопросе у вас было что-то вроде
if unicode == 1:
. Я предлагаю вам использовать другое имя для этой переменной, например use_unicode.
Дополнительные предложения: (1) всегда показывать достаточно кода для воспроизведения ошибки (2) всегда читайте сообщение об ошибке.
Теоретически , кодировка по умолчанию - ISO-8859-1 . Но часто на это нельзя положиться. Веб-сайты, которые не отправляют явную кодировку, заслуживают выговора. Хотите отправить гневное письмо веб-мастеру Endgadget?
htmlSource = htmlSource.decode ("utf8")
должен работать в большинстве случаев, за исключением того, что вы сканируете сайты с неанглийской кодировкой.
или вы можете написать функцию принудительного декодирования, например это
def forcedecode(text):
for x in ["utf8","sjis","cp1252","utf16"]:
try:return text.decode(x)
except:pass
return "Unknown Encoding"
Если явного типа содержимого нет, это должен быть ISO-8859-1, как указано ранее в ответах. К сожалению, это не всегда так, поэтому разработчики браузеров потратили некоторое время на разработку алгоритмов, которые пытаются угадать тип содержимого на основе содержимого вашей страницы.
К счастью для вас, Марк Пилигрим проделал всю тяжелую работу по переносу реализация firefox для python в виде модуля chardet . Его введение о том, как это работает для одной из глав Dive Into Python 3, также стоит прочитать.