Пропустить URL, если время ожидания - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть список URL-адресов

. Я использую следующее для извлечения их содержимого:

for url in url_list:
    req = urllib2.Request(url)
    resp = urllib2.urlopen(req, timeout=5)
    resp_page = resp.read()
    print resp_page

Когда время ожидания истекло, программа просто падает.Я просто хочу прочитать следующий URL, если есть socket.timeout: timed out.Как это сделать?

Спасибо

Ответы [ 3 ]

7 голосов
/ 04 января 2012

Хотя ответ уже есть, я хотел бы отметить, что URLlib2 может не быть единоличным ответственным за такое поведение.

Как указано здесь (и, как это также кажется на основании описания проблемы), исключение может принадлежать библиотеке socket.

В этом случае просто добавьте еще except:

import socket

try:
    resp = urllib2.urlopen(req, timeout=5)
except urllib2.URLError:
    print "Bad URL or timeout"
except socket.timeout:
    print "socket timeout"
1 голос
/ 10 ноября 2011

Похоже, вам просто нужно перехватить исключение тайм-аута. Я не получаю сообщение socket.timeout, которое вы делаете.

req = urllib2.Request("http://127.0.0.2")
try:
    resp = urllib2.urlopen(req, timeout=5)
except urllib2.URLError:
    print "Timeout!"

Очевидно, вам нужен URL-адрес, который на самом деле будет иметь тайм-аут (127.0.0.2 может отсутствовать в вашем ящике).

1 голос
/ 10 ноября 2011

Я собираюсь пойти дальше и предположить, что под «сбоями» вы подразумеваете «поднимает URLError», как описано в urllib2.urlopen документах .См. Раздел Ошибки и исключения Руководства по Python.

for url in url_list:
    req = urllib2.Request(url)
    try:
        resp = urllib2.urlopen(req, timeout=5)
    except urllib2.URLError:
        print "Bad URL or timeout"
        continue # skips to the next iteration of the loop
    resp_page = resp.read()
    print resp_page
...