1

我想检查一个特定的 url 是否存在。

我遇到了两种方法。

网址 = “ http://www.google.com

1.

import urllib2
response = urllib2.urlopen(url)
response.code  # check what is the response code

2.

import httplib 
conn = httplib.HTTPConnection(url) 
conn.request('HEAD', '/') 
response = conn.getresponse() 
if response.status == 200: # check the status code
    # do something

虽然两者都将解决我的目的,但哪一个是实现此目的的更好方法。

提前感谢您的帮助。

4

2 回答 2

2

您可以尝试这些方法,重点是,如果在获取 url 时出现问题,您通常还想处理遇到的错误。

In [4]: import urllib2

In [5]: def test(url):
   ...:     try:
   ...:         response = urllib2.urlopen(url)
   ...:     except urllib2.HTTPError as e:
   ...:         return e.code,None
   ...:     return response.code,response

In [6]: test('http://www.google.com')
Out[6]: 
(200,
 <addinfourl at 154469068 whose fp = <socket._fileobject object at 0x92caa2c>>)

In [7]: test('http://www.google.com/foobar')
Out[7]: (404, None)

实际上,您还需要处理urllib2.URLError

In [10]: def test(url):
    ...:     try:
    ...:         response = urllib2.urlopen(url)
    ...:     except urllib2.HTTPError as err:
    ...:         return err.code, None
    ...:     except urllib2.URLError as err:
    ...:         return err.reason, None
    ...:     return response.code,response

In [11]: test('http://www.google.foo')
Out[11]: (socket.gaierror(-2, 'Name or service not known'), None)
于 2013-01-28T07:48:16.943 回答
2

如果你正确地提出了你的问题,那么这两种方法都不是完美的。

最大的问题是您说“url”,但您只检查方案“http”。但是 URL 可以有不同的方案:

ftp://ftp.funet.fi/pub/standards/RFC/rfc959.txt

文件:///home/somesh/.bashrc

http://www.google.com

“httplib”对这些检查没有用,因为它只能处理“http”方案。另一方面,“urllib2”可以处理我提到的所有方案,但这response.code不是你必须检查的。相反,您应该捕获在资源不可用时将引发的异常:HTTPErrorURLError在这些情况下。

于 2013-01-28T07:49:03.277 回答