Pregunta

Lo que estoy tratando de hacer aquí es obtener los encabezados de una URL determinada, de modo que puede determinar el tipo MIME.Quiero ser capaz de ver si http://somedomain/foo/ devolverá un documento HTML o una imagen JPEG por ejemplo.Por lo tanto, tengo que averiguar cómo enviar una solicitud HEAD por lo que puedo leer el tipo MIME, sin tener que descargar el contenido.¿Alguien sabe de una manera fácil de hacer esto?

¿Fue útil?

Solución

editar:Esta respuesta obras, pero hoy en día sólo debe utilizar el las solicitudes de la biblioteca, como es mencionado por otras respuestas que figuran a continuación.


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

También hay un getheader(name) para obtener un encabezado específico.

Otros consejos

urllib2 puede ser utilizado para realizar una solicitud HEAD.Este es un poco mejor que el uso de httplib desde urllib2 analiza la URL para que en lugar de tener que dividir la URL en el nombre de host y la ruta de acceso.

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

Los encabezados están disponibles a través de response.info() como antes.Curiosamente, usted puede encontrar la dirección URL que usted se redirige a:

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

Obligatorio Requests manera:

import requests

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

Yo creo que el Las solicitudes de la biblioteca debe ser mencionadas.

Solo tienes que:

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

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

Editar:Acabo de vino a darse cuenta de que hay 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'
...

enlace de texto

La integridad de tener un Python3 respuesta equivalente a la aceptada respuesta usando httplib.

Básicamente es el mismo código que la biblioteca no se llama httplib ya pero http.cliente

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

Como un aparte, cuando se utiliza el httplib (al menos en 2.5.2), tratando de leer la respuesta de un JEFE solicitud de bloque (en readline) y posteriormente a fallar.Si no cuestión de leer la respuesta, no puede a enviar otra solicitud en la conexión, usted tendrá que abrir una nueva.O aceptar un retraso de tiempo entre peticiones.

He encontrado que httplib es ligeramente más rápido que urllib2.Yo conté dos programas, el uso de httplib y el otro con urllib2 - envío de solicitudes HEAD 10.000 URL.El httplib uno era más rápido por varios minutos. httplib's total de las estadísticas fueron:real 6m21.334s usuario 0m2.124s sys 0m16.372s

Y urllib2's total de las estadísticas fueron:real 9m1.380 usuario 0m16.666s sys 0m28.565s

¿Alguien más tiene entrada en esta?

Y, sin embargo, otro enfoque (similar a Pawel respuesta):

import urllib2
import types

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

Justo para evitar tener ilimitado en los métodos de nivel de instancia.

Probablemente sea más fácil:el uso de urllib o urllib2.

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

f.info() es un diccionario como objeto, de modo que usted puede hacer f.info()['content-type'], etc.

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

El docs nota que httplib no es normalmente utilizado directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top