1

特定のURLが存在するかどうかを確認したい。

私は2つの方法に出くわしました。

url = " http://www.google.com "

1.1。

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

2.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

file:///home/somesh/.bashrc

http://www.google.com

「httplib」は「http」スキームしか処理できないため、これらのチェックには役立ちません。一方、「urllib2」は、私が言及したすべてのスキームを処理できresponse.codeますが、チェックする必要があるものではありません。代わりに、リソースが利用できない場合に発生する例外をキャッチする必要があります:HTTPErrorまたはURLErrorこれらの場合。

于 2013-01-28T07:49:03.277 に答える