2013-09-25 5 views
2

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

try: 
    urllib2.Request(...) 
except HTTPError as e: 
    self.log.debug("HTTP Error for url %s is %s" % (e.url, e.read())) 

Дело в том, чтобы просто сбросить страницу ошибки в полном объеме в дополнение к e.message. Однако иногда я получаю сообщение UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 4030: ordinal not in range(128), которое, как я считаю, связано с тем, что e.read() принимает ascii char-набор содержимого, где, как возвращенная страница, вероятно, имеет что-то другое.

Мой вопрос: как исправить это? т. е. я хотел бы иметь «разумное» информационное сообщение, сбрасываемое. Я согласен, что это также будет зависеть от кодировки и кодировки, возвращаемой URL-адресом, к которому я пытаюсь подключиться, но если есть какой-либо способ в моем методе e.read для Python, чтобы не пытаться обеспечить символы ASCII

+1

Если 'self.log' является ссылкой на объект стандартного каротажа, вы не должны делать интерполяцию строки, но передать вставленные в качестве параметров:' log.debug («бэ% S составляет% S», е .url, e.read()) '. Это помогает? –

+0

Это не стандартный объект регистрации. Что делать, если я просто хотел напечатать? Извините, я не понимаю, как это поможет? –

+0

Потому что ваш диагноз проблемы неисправен. 'e.read()' ничего не говорит о персонажах, и все равно. Это проблема с интерполяцией строк. –

ответ

1

Просто используйте кодировку и он будет работать, это просто проблема с кодировкой.

try: 
    urllib2.Request(...) 
except HTTPError as e: 
    self.log.debug("HTTP Error for url %s is %s" % (e.url, e.read().encode('utf8'))) 
Смежные вопросы