如何在(py)curl中获取HTTP状态消息?

时间:2010-04-27 18:02:39

标签: python libcurl pycurl http-status

花费一些时间研究pycurl和libcurl文档,我仍然找不到(简单)方法,如何在pycurl中获取HTTP状态消息(reason-phrase)。

状态代码很简单:

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"

4 个答案:

答案 0 :(得分:25)

我自己找到了一个解决方案,它可以满足我的需求,但可以更强大(适用于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"

答案 1 :(得分:2)

我认为你可以使用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

答案 2 :(得分:2)

这是一个老线程,但我到这里寻找类似的信息。如果它只是您正在寻找的状态代码,例如200,404,500等,那么就这样做:

<!DOCTYPE html> <html> <body> <form method="post" action="" id="configForm"> <label for="home">Home:</label> <br> <input type="text" id="home" name="home" required> <br> <label for="apendix">Apêndice:</label> <br> <input type="text" name="apendix" required> <br> <label for="about">Sobre:</label> <br> <input type="text" name="sobre" required> <br> <label for="contato">Contato:</label> <br> <input type="text" name="contato" required> <br><br> <input type="submit" value="Carregar" name="submit"> </form> </body> </html>

应返回数字状态代码:)

答案 3 :(得分:-1)

尝试使用BaseHTTPServer.BaseHTTPRequestHandler.responses,它应该包含一个错误代码字典,如this page中所述。

希望这会有所帮助。