32bit_me (32bit_me) wrote,
32bit_me
32bit_me

Python и urllib

Originally published at 32 bit.me. You can comment here or there.

Столкнулся с неожиданной проблемой при использовании библиотеки urllib (язык Python 3).

Допустим, нужно получить html-код документа, лежащего по определённому адресу. Для этого предназначена функция urllib.request.urlopen(url), возвращающая объект, имеющий интерфейс файла (т.е. поддерживающий те же функции, что и обычные файловые объекты). Далее можно просто прочитать из него текст в соответствующей кодировке: fileobj.read().decode(‘utf-8′), где fileobj – объект, возвращённый функцией urlopen().

При возникновении ошибки при открытии url функция urlopen() вызывает исключение. Поэтому его нужно обработать и повторять попытку открытия url до тех пор, пока операция не завершится без вызова исключения:

1
2
3
4
5
6
while 1:
  try:
    html = urllib.request.urlopen(url).read().decode('utf-8')
  except: print('Url Open Error') #Здесь можно записывать сообщения об ошибке в консоль или в лог
  else:
    break

Однако, проблема состоит в том, что urlopen() не всегда вызывает исключение. Если сервер не отвечает, она просто висит, полностью блокируя работу программы. При этом, при перезапуска программы вручную, документ нормально открывается. Поэтому в качестве параметра ей нужно передавать ещё и величину тайм-аута в секундах:

1
2
3
4
5
6
while 1:
  try:
    html = urllib.request.urlopen(url, timeout = 10).read().decode('utf-8')
  except: print('Url Open Error') #Здесь можно записывать сообщения об ошибке в консоль или в лог
  else:
    break

Теперь всё работает правильно.

Tags: python, программирование
Subscribe

  • Прекрасное под катом

    Людям со слабой психикой под кат не заглядывать! Описание: Книга даёт ответы на главные вопросы науки и человечества, описывает неизвестное…

  • Вселенная-25

    Практически каждый раз, когда начинаются разглагольствования об "обществе потребления", всплывает так называемый "эксперимент Вселенная 25". Если…

  • О групповых проектах

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments