Как получить сообщение о статусе HTTP в (py)curl?
Потратив некоторое время на изучение документации pycurl и libcurl, я до сих пор не могу найти (простой) способ, как получить сообщение о статусе HTTP (фразу-причину) в pycurl.
Код статуса прост:
import pycurl
import cStringIO
curl = pycurl.Curl()
buff = cStringIO.StringIO()
curl.setopt(pycurl.URL, 'http://example.org')
curl.setopt(pycurl.WRITEFUNCTION, buff.write)
curl.perform()
print "status code: %s" % curl.getinfo(pycurl.HTTP_CODE)
# -> 200
# print "status message: %s" % ???
# -> "OK"
5 ответов
Я сам нашел решение, которое делает то, что мне нужно, но может быть более надежным (работает для HTTP).
он основан на том факте, что захваченные заголовки, полученные pycurl.HEADERFUNCTION
включить строку состояния.
import pycurl
import cStringIO
import re
curl = pycurl.Curl()
buff = cStringIO.StringIO()
hdr = cStringIO.StringIO()
curl.setopt(pycurl.URL, 'http://example.org')
curl.setopt(pycurl.WRITEFUNCTION, buff.write)
curl.setopt(pycurl.HEADERFUNCTION, hdr.write)
curl.perform()
print "status code: %s" % curl.getinfo(pycurl.HTTP_CODE)
# -> 200
status_line = hdr.getvalue().splitlines()[0]
m = re.match(r'HTTP\/\S*\s*\d+\s*(.*?)\s*$', status_line)
if m:
status_message = m.groups(1)
else:
status_message = ''
print "status message: %s" % status_message
# -> "OK"
Это старая ветка, но я попал сюда в поисках подобной информации. Если это просто код состояния, который вы ищете, например, 200, 404, 500 и т. Д., Тогда просто сделайте:
your_curl_handle.getinfo(pycurl.RESPONSE_CODE)
который должен вернуть числовой код состояния:)
Я думаю, что вы можете использовать библиотеку human_curl для создания простого кода.
>>> import human_curl as hurl
>>> r = hurl.get('http://example.org')
>>> print r.status_code
200
Полную документацию по human_curl вы можете получить на https://github.com/Lispython/human_curl
Если вам нужен только код, вы можете это сделать, и если ваш
pycurl.Curl()
экземпляр называется
curl
(т.е.
curl = pycurl.Curl()
), ты можешь сделать
curl.getinfo(pycurl.RESPONSE_CODE)
curl.getinfo(pycurl.HTTP_CODE)
Но, на мой взгляд, хороший способ — разобрать заголовок самостоятельно, а не позволять библиотекам кормить вас всем с ложечки.
Попробуйте BaseHTTPServer.BaseHTTPRequestHandler.responses, он должен содержать словарь с кодом ошибки, как описано на этой странице.
надеюсь это поможет.