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

23 投票
5 回答
26842 浏览
提问于 2025-04-15 22:05

我花了一些时间研究pycurl和libcurl的文档,但还是找不到一个简单的方法来获取pycurl中的HTTP状态消息(原因短语)。

获取状态码很简单:

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 个回答

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

8

这是一个旧的讨论串,但我在这里是为了寻找类似的信息。如果你只是想要获取状态码,比如200、404、500等等,那你只需要这样做:

your_curl_handle.getinfo(pycurl.RESPONSE_CODE)

这样就会返回一个数字状态码哦 :)

32

我自己找到了一个解决办法,虽然能满足我的需求,但可能还不够强大(目前只适用于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"

撰写回答