Domanda

Quello che sto cercando di fare qui è ottenere le intestazioni di un determinato URL in modo da poter determinare il tipo MIME. Voglio essere in grado di vedere se http: // somedomain / foo / restituirà un documento HTML o un'immagine JPEG, ad esempio. Pertanto, devo capire come inviare una richiesta HEAD in modo da poter leggere il tipo MIME senza dover scaricare il contenuto. Qualcuno sa un modo semplice per farlo?

È stato utile?

Soluzione

modifica : questa risposta funziona, ma al giorno d'oggi dovresti semplicemente usare richieste come indicato da altre risposte di seguito.


Usa 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')]

C'è anche un getheader (nome) per ottenere un'intestazione specifica.

Altri suggerimenti

urllib2 può essere utilizzato per eseguire una richiesta HEAD. Questo è un po 'più bello dell'uso di httplib poiché urllib2 analizza l'URL per te invece di richiedere di dividere l'URL in nome host e percorso.

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

Le intestazioni sono disponibili su response.info () come prima. È interessante notare che puoi trovare l'URL a cui sei stato reindirizzato:

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

Obbligatorio Richieste modo:

import requests

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

Credo che anche la libreria Richieste dovrebbe essere menzionata.

Just:

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

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

Modifica: ho appena capito che esiste 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'
...

testo del link

Per completezza, avere una risposta Python3 equivalente alla risposta accettata usando httplib .

Fondamentalmente è lo stesso codice solo che la libreria non è più chiamata httplib ma 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

A parte questo, quando si utilizza httplib (almeno su 2.5.2), il tentativo di leggere la risposta di una richiesta HEAD si bloccherà (su readline) e successivamente fallirà. Se non si emette la lettura sulla risposta, non è possibile inviare un'altra richiesta sulla connessione, sarà necessario aprirne una nuova. Oppure accetta un lungo ritardo tra le richieste.

Ho scoperto che httplib è leggermente più veloce di urllib2. Ho cronometrato due programmi - uno usando httplib e l'altro usando urllib2 - inviando richieste HEAD a 10.000 URL. Quello httplib è stato più veloce di alcuni minuti. Le statistiche totali di httplib erano: reali 6m21.334s                                                                     utente 0m2.124s                                                                     sys 0m16.372s

Le statistiche totali di

??e urllib2 erano: reali 9m1.380                                                                     utente 0m16.666s                                                                     sys 0m28.565s

Qualcun altro ha input su questo?

E ancora un altro approccio (simile alla risposta di Pawel):

import urllib2
import types

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

Solo per evitare di avere metodi illimitati a livello di istanza.

Probabilmente più facile: usa urllib o urllib2.

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

f.info () è un oggetto simile a un dizionario, quindi puoi fare f.info () ['content-type'], ecc.

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

I documenti indicano che httplib non viene normalmente utilizzato direttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top