Frage

Was ich versuche, hier zu tun ist, die Header einer bestimmten URL bekommen, so kann ich den MIME-Typ bestimmen. Ich möchte in der Lage sein zu sehen, ob http://somedomain/foo/ ein HTML-Dokument oder ein JPEG-Bild zum Beispiel zurück. So muß ich herausfinden, wie eine HEAD-Anfrage zu senden, so dass ich den MIME-Typen lesen kann, ohne den Inhalt herunterladen zu müssen. Kennt jemand eine einfache Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Bearbeiten : Diese Antwort funktioniert, aber heute sollte man einfach die Anfragen Bibliothek wie unten von anderen Antworten erwähnt.


Verwenden Sie 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')]

Es gibt auch eine getheader(name) auf einen speziellen Header zu erhalten.

Andere Tipps

urllib2 können verwendet werden, um eine HEAD-Anforderung zu erfüllen. Dies ist ein wenig schöner als httplib verwenden, da urllib2 für Sie die URL analysiert statt benötigen Sie die URL in den Hostnamen und den Pfad zu teilen.

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

Headers sind über response.info () nach wie vor zur Verfügung. Interessanterweise können Sie die URL finden, die Sie umgeleitet wurden:

>>> print response.geturl()
http://www.google.com.au/index.html

Requests Art und Weise:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers

Ich glaube, die Anfragen Bibliothek sollte auch erwähnt werden.

Just:

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

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

Edit: Ich habe gerade kam es zu erkennen ist, 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'
...

Link-Text

Der Vollständigkeit halber eine gleichwertige Python3 Antwort auf die akzeptierte Antwort zu haben, mit httplib .

Es ist im Grunde der gleiche Code nur, dass die Bibliothek nicht genannt wird httplib mehr, aber 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)
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

Als Nebenwirkung bei der Verwendung der httplib (zumindest auf 2.5.2) und versucht, die Antwort einer HEAD-Anforderung zu lesen (auf Readline-) blockieren und anschließend fehlschlagen. Wenn Sie nicht auf die Antwort Auslese-, Sie sind nicht in der Lage eine weitere Anforderung an die Verbindung zu senden, müssen Sie ein neues öffnen. Oder akzeptieren eine lange Verzögerung zwischen den Anforderungen.

Ich habe festgestellt, dass httplib ist etwas schneller als urllib2. Ich timed zwei Programme - ein httplib und die andere mit urllib2 mit - HEAD-Anfragen zu 10.000 URLs senden. Die httplib war schneller um mehrere Minuten. httplib ist die Gesamtstatistik waren: real 6m21.334s                                                                     Benutzer 0m2.124s                                                                     sys 0m16.372s

und urllib2 ist die Gesamtstatistik waren: real 9m1.380s                                                                     Benutzer 0m16.666s                                                                     sys 0m28.565s

Hat jemand anderen Eingang auf das?

Und noch ein anderer Ansatz (ähnlich Pawel Antwort):

import urllib2
import types

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

Just zu vermeiden unbegrenzte Methoden auf Instanzebene hat.

Wahrscheinlich einfacher. Verwendung urllib oder urllib2

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

f.info () ist ein Wörterbuch-ähnliches Objekt, so dass Sie f.info tun können () [ 'content-type'], etc.

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

Die docs beachten Sie, dass httplib wird normalerweise nicht direkt verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top