2009-10-31 28 views
22

Estoy tratando de extraer el encabezado de respuesta de una solicitud de URL. Cuando uso Firebug para analizar la salida de respuesta de una petición de URL, devuelve:Python urllib2 Encabezado de respuesta

Content-Type text/html 

Sin embargo cuando se utiliza el código Python:

urllib2.urlopen(URL).info() 

los retornos de salida resultantes:

Content-Type: video/x-flv 

Soy nuevo en Python y en la programación web en general; cualquier información útil es muy apreciada. Además, si necesita más información, hágamelo saber.

Gracias de antemano por leer este post

+0

esto parece un duplicado de http://stackoverflow.com/questions/843392/python-get-http-headers-from-urllib-call –

Respuesta

2

Esta peculiar discrepancia podría explicarse por diferentes cabeceras (tal vez los de la clase aceptar) que se envían por las dos solicitudes - se puede comprobar que ...? O, si Javascript se ejecuta en Firefox (que supongo que estás utilizando cuando estás ejecutando Firebug?) - dado que definitivamente NO se está ejecutando en el caso de Python - "todas las apuestas están desactivadas", como dicen ;-) .

+0

hmmm, no estoy muy seguro de cómo habría dos encabezados diferentes y también cómo sería capaz de distinguir entre ambos. Estoy bastante seguro de que javascript se está ejecutando en Firefox ... ¿Qué sería necesario que haga dentro de Python? – looter

+0

@looter, no existe una forma directa de ejecutar Javascript en Python: si Javascript juega un papel crucial en la determinación del contenido final de la página, la mejor opción es automatizar los navegadores reales en su lugar, p. a través de SeleniumRC. –

+0

No estoy seguro de si Javascript está procesando las solicitudes, porque cuando uso la supervisión de red en firebug, el encabezado de respuesta también se puede ver en la vista HTML. Como mencioné en mi publicación, soy realmente nuevo en python y en la programación/scripting web, por lo que algo de esto está pasando por alto, no estoy seguro si estoy siendo lo suficientemente descriptivo. Gracias por su ayuda hasta ahora. – looter

5

Content-Type text/html

Realmente, así, sin el colon?

Si es así, eso podría explicarlo: es un encabezado no válido, por lo que se ignora, por lo que urllib adivina el tipo de contenido en su lugar, mirando el nombre del archivo. Si la URL tiene '.flv' al final, supondrá que el tipo debe ser video/x-flv.

1

Tenga en cuenta que un servidor web puede devolver resultados diferentes para la misma URL en función de las diferencias en la solicitud. Por ejemplo, negociación de tipo de contenido: el solicitante puede especificar una lista de tipos de contenido que aceptará, y el servidor puede devolver diferentes resultados para tratar de satisfacer diferentes necesidades.

Además, puede estar recibiendo una página de error para una de sus solicitudes, por ejemplo, porque está mal formada, o no tiene cookies establecidas que lo autentiquen correctamente, etc. Mire la respuesta en sí para ver qué te estás poniendo.

35

Intenta solicitar como lo hace Firefox. Se puede ver los encabezados de la solicitud en Firebug, así añadirlos a su solicitud objeto:

import urllib2 

request = urllib2.Request('http://your.tld/...') 
request.add_header('User-Agent', 'some fake agent string') 
request.add_header('Referer', 'fake referrer') 
... 
response = urllib2.urlopen(request) 
# check content type: 
print response.info().getheader('Content-Type') 

También hay HTTPCookieProcessor que puede hacerlo mejor, pero no creo que lo necesitará en la mayoría de los casos. Echar un vistazo a la documentación de Python:

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

+3

para Python 3: 'response.info() [" content-type "]' –

+0

¿Es completamente imposible que un sitio verifique si una solicitud tiene una referencia falsa o no? No tengo suerte con lo que intento, siempre hay el error "Revisor inválido, no cargará xy" ... – Nearoo

+0

Además, si info() no muestra una fila "Referer": ¿Puedo concluir que el " el referer falso "no funcionó? – Nearoo

0

acuerdo con http://docs.python.org/library/urllib2.html sólo hay get_header() método y nada de getheader.

pregunto porque su código funciona bien para

response.info().getheader('Set cookie') 

pero una vez que ejecute

response.info().get_header('Set cookie') 

me sale:

Traceback (most recent call last): 
    File "baza.py", line 11, in <module> 
    cookie = response.info().get_header('Set-Cookie') 
AttributeError: HTTPMessage instance has no attribute 'get_header' 

edición: Además
response.headers.get('Set-Cookie') funciona bien, así , no hombres cionado en el doc urlib2 ....

+0

get_header() es para la clase urllib2.Request. La clase de respuesta utiliza getheader() en su lugar, que es una desafortunada discrepancia. –

-1

importación urllib.request

fhand = urllib.request.urlopen ('http://data.pr4e.org/intro-short.txt')

de impresión (fhand.info())

+0

Bienvenido a SO. Lea este [cómo-para-responder] (http://stackoverflow.com/help/how-to-answer) para proporcionar una respuesta de calidad. – thewaywewere