116

ここでやろうとしているのは、指定された URL のヘッダーを取得して、MIME タイプを判別できるようにすることです。http://somedomain/foo/たとえば、HTML ドキュメントまたは JPEG 画像を返すかどうかを確認できるようにしたいと考えています。したがって、コンテンツをダウンロードせずに MIME タイプを読み取れるように、HEAD 要求を送信する方法を理解する必要があります。これを行う簡単な方法を知っている人はいますか?

4

11 に答える 11

109

urllib2を使用して HEAD リクエストを実行できます。これは、URL をホスト名とパスに分割する必要がなく、urllib2 が URL を解析してくれるため、httplib を使用するよりも少し便利です。

>>> import urllib2
>>> class HeadRequest(urllib2.Request):
...     def get_method(self):
...         return "HEAD"
... 
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))

ヘッダーは、以前と同様に response.info() を介して利用できます。興味深いことに、リダイレクト先の URL を見つけることができます。

>>> print response.geturl()
http://www.google.com.au/index.html
于 2010-01-15T10:50:52.677 に答える
104

編集:この回答は機能しますが、最近は、以下の他の回答で説明されているように、リクエストライブラリを使用する必要があります。


httplibを使用します。

>>> import httplib
>>> conn = httplib.HTTPConnection("www.google.com")
>>> conn.request("HEAD", "/index.html")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK
>>> print res.getheaders()
[('content-length', '0'), ('expires', '-1'), ('server', 'gws'), ('cache-control', 'private, max-age=0'), ('date', 'Sat, 20 Sep 2008 06:43:36 GMT'), ('content-type', 'text/html; charset=ISO-8859-1')]

getheader(name)特定のヘッダーを取得するためのもあります。

于 2008-09-20T06:45:45.010 に答える
73

必須のRequests方法:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
于 2012-10-21T11:00:49.547 に答える
37

Requestsライブラリについても言及する必要があると思います。

于 2011-09-12T12:02:47.290 に答える
17

ただ:

import urllib2
request = urllib2.Request('http://localhost:8080')
request.get_method = lambda : 'HEAD'

response = urllib2.urlopen(request)
response.info().gettype()

編集: httplib2 があることに気づきました:D

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert resp[0]['status'] == 200
assert resp[0]['content-type'] == 'text/html'
...

リンクテキスト

于 2010-12-12T12:45:54.757 に答える
11

完全を期すために、httplibを使用して受け入れられた回答と同等のPython3回答を取得します。

ライブラリがhttplibではなくhttp.clientと呼ばれることは、基本的に同じコードです。

from http.client import HTTPConnection

conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()

print(res.status, res.reason)
于 2013-03-14T21:38:44.830 に答える
2
import httplib
import urlparse

def unshorten_url(url):
    parsed = urlparse.urlparse(url)
    h = httplib.HTTPConnection(parsed.netloc)
    h.request('HEAD', parsed.path)
    response = h.getresponse()
    if response.status/100 == 3 and response.getheader('Location'):
        return response.getheader('Location')
    else:
        return url
于 2012-02-10T12:39:59.143 に答える
1

余談ですが、httplib (少なくとも 2.5.2) を使用している場合、HEAD リクエストの応答を読み取ろうとすると (readline で) ブロックされ、その後失敗します。応答に対して read を発行しないと、接続で別の要求を送信できず、新しい要求を開く必要があります。または、リクエスト間の長い遅延を受け入れます。

于 2009-04-23T01:39:05.743 に答える
1

httplib は urllib2 よりもわずかに高速であることがわかりました。1 つは httplib を使用し、もう 1 つは urllib2 を使用して、10,000 の URL に HEAD リクエストを送信する 2 つのプログラムの時間を計りました。httplib の方が数分高速でした。 httplibの合計統計は次のとおりです: real 6m21.334s user 0m2.124s sys 0m16.372s

そしてurllib2の合計統計は次のとおりです: real 9m1.380s user 0m16.666s sys 0m28.565s

他の誰かがこれについて意見を持っていますか?

于 2010-04-13T15:10:00.393 に答える
0

さらに別のアプローチ(Pawelの回答に似ています):

import urllib2
import types

request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)

インスタンスレベルで無制限のメソッドを持つことを避けるためです。

于 2013-06-06T10:55:31.970 に答える
-4

おそらく簡単です: urllib または urllib2 を使用します。

>>> import urllib
>>> f = urllib.urlopen('http://google.com')
>>> f.info().gettype()
'text/html'

f.info() は辞書のようなオブジェクトなので、 f.info()['content-type'] などを実行できます。

http://docs.python.org/library/urllib.html
http://docs.python.org/library/urllib2.html
http://docs.python.org/library/httplib.html

ドキュメントでは、httplib は通常直接使用されないことに注意してください。

于 2008-12-11T00:11:48.057 に答える