Python 正则表达式帮助(httplib2 Cookies)
我遇到和这个问题提问者一样的情况:httplib2,如何设置多个cookie?
这个cookie看起来是这样的……
PHPSESSID=8527b5532b6018aec4159d81f69765bd; path=/; expires=Fri, 19-Feb-2010 13:52:51 GMT, id=1578; expires=Mon, 22-Feb-2010 13:37:51 GMT, password=123456; expires=Mon, 22-Feb-2010 13:37:51 GMT, sid=8527b5532b6018aec4159d81f69765bd
注意到它是用逗号和分号来分隔不同的cookie,但逗号在cookie的内容里也会出现。
这让我觉得太复杂了,我写不出一个正则表达式来正确分隔这些cookie。如果有人愿意帮忙写一下,我会非常感激!
2 个回答
注意,它使用逗号和分号来分隔 cookies,但在 cookie 本身中也使用了逗号。
正如所引用的,模糊的逗号让这个字符串无法用正则表达式或其他工具解析。这个字符串是从哪里来的呢?
作为一个 Set-Cookie:
头部的值,它完全无效,在任何浏览器中都无法使用。浏览器会把 PHPSESSID 设置为一个会话 cookie(因为过多的逗号导致过期日期格式无效),并忽略其他部分。多个 cookies 必须用多个 Set-Cookie
头部来设置,而不能合并成一个。
编辑:好的,似乎发生的事情是 httplib2 正在使用标准库的 email
包来解析 HTTP 响应数据中的头部。在电子邮件中,RFC822 标准要求多个同名的头部(比如 To:
地址)等同于一个头部,值用逗号连接。
然而,HTTP 响应显然不是 RFC822 标准的一部分;用这种方式处理它们是完全不合适的。看起来,使用 email
来解析 HTTP 响应,让 httplib2
无法正确处理任何重复使用的头部,而 Set-Cookie
头部经常就是这样使用的。因此,我认为 httplib2
根本上是有问题的,建议不要使用它。
你有没有试过 cookielib 或者 http.cookiejar 呢?
如果你把 cookie 理解成这样
PHPSESSID=8527b5532b6018aec4159d81f69765bd;
path=/;
expires=Fri, 19-Feb-2010 13:52:51 GMT, id=1578;
expires=Mon, 22-Feb-2010 13:37:51 GMT, password=123456;
expires=Mon, 22-Feb-2010 13:37:51 GMT, sid=8527b5532b6018aec4159d81f69765bd
那么只有分号是真正的分隔符,而逗号分隔符只是因为它前面有一个过期日期。
如果你不关心过期日期的话,你可以用一个正则表达式来过滤掉过期日期,比如说:
s/expires=[^,]+,[^,]+, //g
然后用 ;
来分割整个字符串,把它们解析成 key=value
的形式。