web-dev-qa-db-fra.com

En-tête de réponse Python urllib2

J'essaie d'extraire l'en-tête de réponse d'une demande d'URL. Lorsque j'utilise firebug pour analyser le résultat de la réponse d'une requête d'URL, il renvoie:

Content-Type text/html

Cependant, lorsque j'utilise le code python:

urllib2.urlopen(URL).info()

la sortie résultante renvoie:

Content-Type: video/x-flv

Je suis nouveau sur python et sur la programmation web en général; toute idée utile est très appréciée. Aussi, si plus d'informations sont nécessaires s'il vous plaît faites le moi savoir.

Merci d'avance d'avoir lu ce post

24
looter

Essayez de demander comme Firefox. Vous pouvez voir les en-têtes de requête dans Firebug, ajoutez-les donc à votre objet de requête:

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

Il existe également HTTPCookieProcessor qui peut améliorer les choses, mais je ne pense pas que vous en aurez besoin dans la plupart des cas. Regardez la documentation de python:

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

36
qingbo

Type de contenu text/html

Vraiment, comme ça, sans les deux points?

Si c'est le cas, cela pourrait l'expliquer: c'est un en-tête non valide, donc il est ignoré, donc urllib devine le type de contenu, en regardant le nom du fichier. Si l’URL contient «.flv» à la fin, le type devrait être video/x-flv.

5
bobince

Cette divergence particulière peut s'expliquer par l'en-tête différent (peut-être du type accept) envoyé par les deux demandes - pouvez-vous vérifier cela ...? Ou, si JavaScript est en cours d'exécution dans Firefox (que je suppose que vous utilisez lorsque vous utilisez firebug?) - puisqu'il ne fonctionne certainement pas dans le cas Python - "tous les paris sont ouverts", comme on dit ;-) .

2
Alex Martelli

N'oubliez pas qu'un serveur Web peut renvoyer des résultats différents pour la même URL en fonction des différences dans la demande. Par exemple, négociation de type de contenu: le demandeur peut spécifier une liste de types de contenu qu'il acceptera et le serveur peut renvoyer des résultats différents pour tenter de répondre à des besoins différents.

En outre, il se peut que vous receviez une page d'erreur pour l'une de vos demandes, par exemple, parce que celle-ci est mal formée ou que des cookies ne vous ont pas été authentifiés correctement, etc. Regardez la réponse elle-même pour voir ce que vous obtenez.

1
Ned Batchelder

selon http://docs.python.org/library/urllib2.html il n’existe que la méthode get_header() et rien sur la variable getheader.

Demander parce que votre code fonctionne bien pour 

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

mais une fois que j'exécute 

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

je reçois:

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'

edit: De plus
response.headers.get('Set-Cookie') fonctionne bien aussi, pas mentionné dans urlib2 doc ....

0
modzello86