Вопрос

Здесь я пытаюсь получить заголовки заданного URL-адреса, чтобы определить тип MIME.Я хочу иметь возможность увидеть, если http://somedomain/foo/ например, вернет документ HTML или изображение JPEG.Таким образом, мне нужно выяснить, как отправить запрос HEAD, чтобы я мог прочитать тип MIME без необходимости загружать контент.Кто-нибудь знает простой способ сделать это?

Это было полезно?

Решение

редактировать:Этот ответ работает, но в настоящее время вам следует просто использовать Запросы библиотека, как упоминалось в других ответах ниже.


Использовать 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')]

Также есть getheader(name) чтобы получить конкретный заголовок.

Другие советы

urllib2 может использоваться для выполнения запроса HEAD.Это немного удобнее, чем использование httplib, поскольку urllib2 анализирует URL-адрес вместо того, чтобы требовать от вас разделения URL-адреса на имя хоста и путь.

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

Заголовки доступны через response.info(), как и раньше.Интересно, что вы можете найти URL-адрес, на который вы были перенаправлены:

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

Обязательный Requests способ:

import requests

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

Я верю, Запросы Отдельно стоит упомянуть библиотеку.

Только:

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

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

Редактировать:Я только что понял, что есть 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'
...

текст ссылки

Для полноты ответа Python3, эквивалентного принятому ответу, используйте httplib.

По сути, это тот же код, только библиотека не вызывается. httplib больше, но http.клиент

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

Кроме того, при использовании httplib (по крайней мере, в версии 2.5.2) попытка прочитать ответ на запрос HEAD заблокируется (в строке чтения) и впоследствии завершится неудачно.Если вы не выдадите чтение ответа, вы не сможете отправить еще один запрос на соединение, вам нужно будет открыть новый.Или смиритесь с большой задержкой между запросами.

Я обнаружил, что httplib немного быстрее, чем urllib2.Я запрограммировал две программы — одну с использованием httplib, а другую с использованием urllib2 — отправку запросов HEAD на 10 000 URL-адресов.httplib был быстрее на несколько минут. httplibОбщая статистика была:Real 6m21.334s Пользователь 0M2.124S SYS 0M16.372S

И urllib2Общая статистика была:Реальный 9m1.380s Пользователь 0m16.666S Sys 0M28.565S

Есть ли у кого-нибудь еще мнение по этому поводу?

И еще один подход (похожий на ответ Павла):

import urllib2
import types

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

Просто чтобы избежать неограниченных методов на уровне экземпляра.

Наверное, проще:используйте urllib или urllib2.

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

f.info() — это объект, похожий на словарь, поэтому вы можете использовать f.info()['content-type'] и т. д.

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

В документации отмечается, что httplib обычно не используется напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top