2

可能重复:
web2py url 验证器

你能帮我处理这段代码吗?

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

4 回答 4

3

如果您尝试从web2py url validator实现代码,您会注意到您已在不需要的地方添加并缩进 else。空格在 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
于 2012-08-16T11:01:23.823 回答
2

尝试在您的输入中输入完整的 URL:

entersomething http://www.google.com

您需要指定请求的类型,以便它理解正确处理它(在本例中为http)。

于 2012-08-16T08:17:31.857 回答
0

前缀 URLhttp://

例子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 等等。

于 2012-08-16T08:17:30.940 回答
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. 你可以在这里找到更详细的讨论

于 2012-08-16T11:21:01.507 回答