httplib в Python, чтобы получить код состояния ... но это слишком сложно? - PullRequest
0 голосов
/ 13 ноября 2009
>>> import httplib
>>> conn = httplib.HTTPConnection("www.google.com")
>>> conn.request("HEAD", "/index.html")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK

Этот код получит код состояния HTTP. Однако обратите внимание, что я разделил «google.com» и «/index.html» на 2 строки.

И это сбивает с толку.

Что делать, если я хочу найти код состояния только общего URL-адреса ???

http://mydomain.com/sunny/boo.avi
http://anotherdomain.com/podcast.mp3
http://anotherdomain.com/rss/fee.xml

Разве я не могу просто вставить URL-адрес в него и заставить его работать?

Редактировать ... Я не могу использовать urllib, потому что я не хочу скачивать файл

Ответы [ 6 ]

6 голосов
/ 13 ноября 2009

В качестве альтернативы, если вы ожидаете, что загрузка данных действительно проблематична и вам действительно нужен метод HEAD, вы можете проанализировать URL-адрес, используя urlparse:

>>> import httplib
>>> import urlparse
>>> url = "http://www.google.com/index.html"
>>> (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url)
>>> conn = httplib.HTTPConnection(netloc)
>>> conn.request("HEAD", urlparse.urlunparse(('', '', path, params, query, fragment))
>>> res = conn.getresponse()
>>> print res.status, res.reason
302 Found

И оберните это в функцию, принимающую URL в качестве аргумента.

6 голосов
/ 13 ноября 2009

Может быть, вам лучше использовать библиотеку URL вместо этого?

В Python 2 используйте urllib2:

>>> import urllib2
>>> url = urllib2.urlopen("http://www.google.com/index.html")
>>> url.getcode()
200

В Python 3 используйте urllib.request:

>>> import urllib.request
>>> url = urllib.request.urlopen("http://www.google.com/index.html")
>>> url.getcode()
200
2 голосов
/ 13 ноября 2009

Метод connect принимает аргумент сервера (с необязательным портом). Вы должны разорвать соединение с ресурсом, который вам действительно нужен.

Чтобы упростить загрузку веб-ресурсов напрямую, можно использовать urllib2, но urllib2 поддерживает только методы GET или POST, но не HEAD, поэтому в итоге вы скачиваете весь ресурс.

0 голосов
/ 13 ноября 2009

Имейте в виду, что не все веб-серверы поддерживают HEAD на каждом ресурсе, поэтому вы все равно получите ресурс. Вы должны написать код соответственно.

0 голосов
/ 13 ноября 2009

Мне нравится urllib2, пример кода:

import urllib2
res = urllib2.urlopen('http://google.com/index.html')
res.getCode() #contains code

Если что-то пошло не так, вы получите исключение, которое вы можете поймать.

РЕДАКТИРОВАТЬ: Спасибо, изменяется res.code на res.getCode(), так как второй документально подтвержден

0 голосов
/ 13 ноября 2009

В соответствии с spec вы должны разделить это так, возможно, Python может немного абстрагироваться для вас, они, вероятно, просто дают вам прямой доступ к заголовку, чтобы вы точно знали, как он отформатированный, который действительно предпочтение.

...