Vra

Wat ek probeer om hier te doen is kry die kop van 'n gegewe URL sodat ek kan die MIME-tipe te bepaal. Ek wil in staat wees om te sien of http://somedomain/foo/ 'n beeld 'n JPEG byvoorbeeld HTML dokument of sal terugkeer. So, ek moet uitvind hoe om 'n HEAD-versoek te stuur sodat ek die MIME-tipe kan lees sonder om die inhoud te laai. Is daar iemand weet van 'n maklike manier om dit te doen?

Was dit nuttig?

Oplossing

wysig : Hierdie antwoord werk, maar deesdae moet jy net gebruik die versoeke biblioteek soos genoem deur ander antwoorde hieronder.


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

Daar is ook 'n getheader(name) om 'n spesifieke kop kry.

Ander wenke

urllib2 gebruik kan word om 'n HEAD-versoek uit te voer. Dit is 'n bietjie mooier as die gebruik van httplib sedert urllib2 ontleed die URL vir jou in plaas van wat jy aan die URL verdeel in gasheer naam en die pad.

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

Headers is beskikbaar via response.info () as tevore. Interessant genoeg, kan jy die URL wat jy getrek het om uit te vind:

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

Verpligtend Requests manier:

import requests

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

Ek glo die Versoeke biblioteek asook moet genoem word.

Just:

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

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

Edit: Ek het net gekom om te besef daar is 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'
...

skakel teks

Vir volledigheid 'n Python3 antwoord gelykstaande aan die aanvaarde antwoord het met behulp van httplib .

Dit is basies dieselfde kode net dat die biblioteek nie genoem httplib nie maar 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

As 'n eenkant, by die gebruik van die httplib (ten minste op 2.5.2), probeer om die reaksie van 'n HEAD-versoek sal blok (op read line) en daarna versuim lees. As jy nie lees op die reaksie uit te reik, nie in staat is om 'n ander versoek op die verband te stuur jy is, sal jy nodig het om 'n nuwe een oop te maak. Of aanvaar 'n lang vertraging tussen versoeke.

Ek het gevind dat httplib is effens vinniger as urllib2. Ek snel twee programme - een met behulp van httplib en die ander met behulp van urllib2 - stuur HEAD versoeke om 10.000 URL. Die httplib een was vinniger deur 'n paar minute. httplib se totale statistieke was soos volg: real 6m21.334s                                                                     gebruiker 0m2.124s                                                                     sys 0m16.372s

en urllib2 se totale statistieke was soos volg: real 9m1.380s                                                                     gebruiker 0m16.666s                                                                     sys 0m28.565s

Het enige iemand het anders insette op hierdie?

En nog 'n benadering (soortgelyk aan Pawel antwoord):

import urllib2
import types

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

Net om te verhoed dat ongeleide metodes by byvoorbeeld vlak.

Waarskynlik makliker. Gebruik urllib of urllib2

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

f.info () is 'n woordeboek-agtige voorwerp, sodat jy kan doen f.info () [ 'inhoud-tipe "], ens.

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

Die dokumente daarop dat httplib is nie normaalweg direk gebruik.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top