Неверный URL-адрес, исключение - Python - PullRequest
0 голосов
/ 20 июня 2011
import httplib
import urlparse

def getUrl(url):
   try:
     parts = urlparse.urlsplit(url)
     server = parts[1]
     path = parts[2]
     obj = httplib.HTTPConnection(server,80)
     obj.connect()
     obj.putrequest('HEAD',path)
     obj.putheader('Accept','*/*')
     obj.endheaders()
     response = obj.getresponse()
     contentType = response.getheader("content-type", "unknown")
     obj.close()
     if response.status !=200:
       print 'Error'
     else:
       print 'Awesome'
   except Exception, e:
     print e

Я написал код выше, чтобы проверить, является ли данный URL действительным или нет. Но каким-то образом, когда я проверяю его, для каждого недействительного URL он выдает исключение.

>>> getUrl('http://www.idlebrfffain.com')
[Errno -2] Name or service not known

Версия Python:

chaitu@ubuntu:~$ python -V
Python 2.6.4

Может кто-нибудь помочь мне выяснить, в чем именно ошибка?

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Вы должны поймать socket.error:

import httplib, socket
import urlparse

def getUrl(url):
    parts = urlparse.urlsplit(url)
    server = parts[1]
    path = parts[2]
    obj = httplib.HTTPConnection(server,80)

    try:
        obj.connect()
    except socket.gaierror:
        print "Host %s does not exist" % server
        return
    except socket.error:
        print "Cannot connect to %s:%s." % (server, 80)
        return

    obj.putrequest('HEAD',path)
    obj.putheader('Accept','*/*')
    obj.endheaders()
    response = obj.getresponse()
    contentType = response.getheader("content-type", "unknown")
    obj.close()
    if response.status !=200:
        print 'Error'
    else:
        print 'Awesome'


getUrl('http://www.idlebrfffain.com') # not a registered domain
getUrl('http://8.8.8.8') # not a http server

Только try: except: вокруг определенных строк и только если вы знаете, что происходит.Python покажет вам трассировки для необработанных исключений, чтобы вы могли легко выяснить, где проблема.

2 голосов
/ 20 июня 2011

Это должно произойти. Возникает исключение, поскольку URL-адрес не может быть разрешен. Выдается до вашей линии if response.status != 200, которая передает управление вашему блоку except.

Вам нужно потратить некоторое время на изучение того, как Исключения работают. Вот пример того, что вы можете попробовать.

def getUrl(url):
    status = None
    try:
        # do your normal stuff...
        status = response.status
    except Exception, e:
        # do whatever you want here...
        pass
    finally:
        if status != 200:
            print "Error"
        else:
            print "Awesome"
1 голос
/ 21 июня 2011
#The following code validates a url. This is a 2 step process, to do that. First I validate the domain and next the path attached to the domain.
from urlparse import urlparse
import urllib2
import socket
class ValidateURL:
    def __init__(self, url):
        self._url = url

    def startActivity(self):
        self._parts = urlparse(self._url)
        a = self._checkDomain(self._parts[1])
        if a:
            b = self._checkUrl(self._url)
            if b == 1:
                print self._url,' is valid'
            else:
                print 'The path ',self._parts[2],' is not valid'
        else:
            print self._parts[1],' domain does not exist'

    #Checks whether the domain is right or not
    def _checkDomain(self,domain):
        x = 1
        try:
            socket.gethostbyname_ex(domain)
        except socket.gaierror:
            x = 0
        except socket.error:
            x = 0
        finally:
            return x

    #Checks whether the path is right or not
    def _checkUrl(self,url):
        x = 1
        self._req = urllib2.Request(url)
        try: 
            urllib2.urlopen(self._req)
        except urllib2.URLError, e:
            #print e
            x = 0
        finally:
            return x

if __name__ == "__main__":
    valid = ValidateURL('http://stackoverflow.com/questions/invalid-urls-throw-an-exception-python')
    valid.startActivity()
    valid1 = ValidateURL('/4710682/nevernyi-url-adres-isklychenie-python')
    valid1.startActivity()

Надеюсь, что решение, которое я получил, является разумным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...