python读取并验证输入URL

时间:2012-08-16 08:09:39

标签: python url input

  

可能重复:
  web2py url validator

你会帮我解释一下这段代码吗?

from urllib2 import Request, urlopen, URLError

url = raw_input('enter something')
req = Request(url)
try:
    response = urlopen(req)
except URLError, e:
    if hasattr(e, 'reason'):
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    elif hasattr(e, 'code'):
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code
    else:
        print 'URL is good!'

4 个答案:

答案 0 :(得分:3)

如果您尝试实现web2py url validator中的代码,您会注意到已添加并缩进其他不需要的代码。白色空间在python中很重要。我之前的答案中给出的代码是正确的,您刚刚错误地复制了它。你的代码应该是这样的(与我以前的答案相同):

from urllib2 import Request, urlopen, URLError

url = raw_input('enter something')
req = Request(url)
try:
    response = urlopen(req)
except URLError, e:
    if hasattr(e, 'reason'):
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    elif hasattr(e, 'code'):
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code
else:
    print 'URL is good!'

else子句是try的一部分,但不是异常测试的一部分。基本上,如果没有抛出异常,则url有效。如果输入http://www.google.com

,以下代码会为您提供此结果
python test.py 
enter somethinghttp://www.google.com
URL is good!

如果您输入http://www.google.com/bad,则会获得:

python test.py 
enter somethinghttp://www.google.com/bad
The server couldn't fulfill the request.
Error code:  404

答案 1 :(得分:2)

尝试在输入中输入完整的网址:

entersomething http://www.google.com

您需要指定请求的类型,以便它理解正确处理它(在这种情况下,http)。

答案 2 :(得分:0)

前缀网址为http://

示例http://www.google.com

In [16]: response = urllib2.urlopen("http://www.google.com")

In [17]: response
Out[17]: <addinfourl at 28222408 whose fp = <socket._fileobject object at 0x01AE59B0>>

urllib2模块定义了有助于在复杂世界中打开URL(主要是HTTP)的函数和类 - 基本和摘要式身份验证,重定向,cookie等。

答案 3 :(得分:0)

您提供的堆栈显示您收到了ValueError

"C:\Python25\lib\urllib2.py", line 241, in get_type raise ValueError, "unknown url type: %s" % self.__original ValueError: unknown url type: www.google.com

因此,您可以为ValueError添加另一个except子句,以通知用户该url无效。

或者如果您打算更正网址,请使用url.lower().startswith('http://') or ...

另请注意,urlopen可以抛出许多其他异常,因此可能也想要捕获泛型Exception。您可以找到更详细的讨论here