我有一个原始HTTP字符串,我想表示对象中的字段。有没有办法从HTTP字符串中解析单个头?
'GET /search?sourceid=chrome&ie=UTF-8&q=ergterst HTTP/1.1\r\nHost: www.google.com\r\nConnection: keep-alive\r\nAccept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nUser-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.45 Safari/534.13\r\nAccept-Encoding: gzip,deflate,sdch\r\nAvail-Dictionary: GeNLY2f-\r\nAccept-Language: en-US,en;q=0.8\r\n
[...]'
标准库中有非常好的工具,既可以解析RFC 821头,也可以解析整个HTTP请求。下面是一个示例请求字符串(请注意,Python将其视为一个大字符串,即使我们为了可读性而将其分成几行),我们可以将其提供给我的示例:
正如@trypy所指出的,您可以使用Python的email消息库来解析头-不过,我们应该添加的是,一旦您完成创建,生成的
Message
对象就像头字典一样:当然,这会忽略请求行,或者让您自己解析它。结果发现有一个更好的解决方案。
如果您使用标准库的
BaseHTTPRequestHandler
,它将为您解析HTTP。尽管它的文档有点晦涩——标准库中的整个HTTP和URL工具套件都有问题——但是要使它解析字符串,您所要做的就是(a)将字符串包装在BytesIO()
中,(b)阅读raw_requestline
以便它随时可以被解析,(c)捕获解析过程中出现的任何错误代码,而不是让它尝试将它们写回客户端(因为我们没有这样的代码!)。下面是我们对标准库类的专门化:
同样,我希望标准库的人已经意识到HTTP解析应该以一种不需要我们编写九行代码来正确调用它的方式进行,但是你能做什么呢?下面是如何使用这个简单的类:
如果在解析过程中出现错误,
error_code
将不会是None
:我更喜欢使用这样的标准库,因为我怀疑他们已经遇到并解决了任何边缘情况,如果我自己尝试用正则表达式重新实现一个Internet规范,这些情况可能会让我感到不快。
旧Python 2代码
这是我第一次写这个答案时的原始代码:
以及:
以及:
以及:
以及:
mimetools
自Python 2.3以来一直被弃用,并完全从Python 3中删除(link)。以下是在Python 3中应如何操作:
如果去掉
GET
行,这似乎可以正常工作:解析示例并将信息从第一行添加到对象的方法是:
相关问题 更多 >
编程相关推荐